我正在尝试在 R 中转换我的数据,但我无法获得我想要的列。
我的数据集如下,我想得到的列是“total”,它是D1+D2+D3+D4+D5的总和,忽略“NA”。
| NR | D1 | D2 | D3 | D4 | D5 | 全部的 |
|---|---|---|---|---|---|---|
| 一种 | 1 | 不适用 | 不适用 | 1 | 不适用 | 2 |
| 乙 | 不适用 | 不适用 | 不适用 | 不适用 | 不适用 | 不适用 |
| C | 不适用 | 1 | 不适用 | 不适用 | 不适用 | 1 |
这可能是一个相当愚蠢的问题,但我无法理解。
我已经尝试过:
total <- NA
total <- ifelse(D1==1, 1, total)
total <- ifelse(D2==1, total + 1, total)
total <- ifelse(D3==1, total + 1, total)
total <- ifelse(D4==1, total + 1, total)
total <- ifelse(D5==1, total + 1, total)
Run Code Online (Sandbox Code Playgroud)
但它将我所有的行返回到“NA”
我试过:
total <- mutate(dataset, total=D1+D2+D3+D4+D5)
Run Code Online (Sandbox Code Playgroud)
但是我没有得到 D1 到 D5 的值的聚合。
我们可以用 rowSums
df1$total <- rowSums(df1[startsWith(names(df1), "D")], na.rm = TRUE)
df1$total[df1$total == 0] <- NA
Run Code Online (Sandbox Code Playgroud)
或者同样的逻辑 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
Run Code Online (Sandbox Code Playgroud)
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))
Run Code Online (Sandbox Code Playgroud)
这是一个解决方案c_across和rowwise
library(dplyr)
df %>%
rowwise() %>%
mutate(Total = sum(c_across(D1:D5 & where(is.numeric)), na.rm = TRUE))
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
数据:
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")
Run Code Online (Sandbox Code Playgroud)