按行编辑数据
我正在尝试在 R 中转换我的数据,但我无法获得我想要的列。
我的数据集如下,我想得到的列是“total”,它是D1+D2+D3+D4+D5的总和,忽略“NA”。
| NR | D1 | D2 | D3 | D4 | D5 | 全部的 |
|---|---|---|---|---|---|---|
| 一种 | 1 | 不适用 | 不适用 | 1 | 不适用 | 2 |
| 乙 | 不适用 | 不适用 | 不适用 | 不适用 | 不适用 | 不适用 |
| C | 不适用 | 1 | 不适用 | 不适用 | 不适用 | 1 |
回答
我们可以用 rowSums
df1$total <- rowSums(df1[startsWith(names(df1), "D")], na.rm = TRUE)
df1$total[df1$total == 0] <- NA
或者同样的逻辑 dplyr
library(dplyr)
df1 %>%
mutate(total = na_if(rowSums(select(., starts_with('D')), na.rm = TRUE), 0))
NR D1 D2 D3 D4 D5 total
1 A 1 NA NA 1 NA 2
2 B NA NA NA NA NA NA
3 C NA 1 NA NA NA 1
数据
df1 <- structure(list(NR = c("A", "B", "C"), D1 = c(1L, NA, NA), D2 = c(NA,
NA, 1L), D3 = c(NA, NA, NA), D4 = c(1L, NA, NA), D5 = c(NA, NA,
NA), total = c(2L, NA, 1L)), class = "data.frame", row.names = c(NA,
-3L))
回答
这是一个解决方案c_across和rowwise
library(dplyr)
df %>%
rowwise() %>%
mutate(Total = sum(c_across(D1:D5 & where(is.numeric)), na.rm = TRUE))
输出:
NR D1 D2 D3 D4 D5 Total
<chr> <int> <int> <lgl> <int> <lgl> <int>
1 A 1 NA NA 1 NA 2
2 B NA NA NA NA NA 0
3 C NA 1 NA NA NA 1
数据:
structure(list(NR = c("A", "B", "C"), D1 = c(1L, NA, NA), D2 = c(NA,
NA, 1L), D3 = c(NA, NA, NA), D4 = c(1L, NA, NA), D5 = c(NA, NA,
NA)), row.names = c(NA, -3L), class = "data.frame")