r语言 - 如何通过条件突变添加新列,但保留原始数据框架?



我有一个大的数据框架(df)包含500+行,50+列/变量,但只希望针对特定的变量。

targ_vars <- c("all3a1", "3a1_arc",
"all3b1", "3b1_arc",
"all3c1", "3c1_arc")

上面的向量包含有频率数据的变量(即有1、2、3等的多行)

我想在原来的大数据框(df)中添加一个新的计数列,该列包含任何非na值的行和,特别是对于"targ_vars"中的那些选择变量。

再一次,我并没有试图将这些变量的实际频率数据的值相加,而只是将每行的任何非NA值相加(即1,2,NA,7,NA,1 = 4个非NA的总行数)。

我已经讲到这里了:

df <- df %>%
select(targ_vars) %>%
mutate(targ_var_count = rowSums(!is.na(.), na.rm = TRUE))

问题是我不确定如何"取消选择"我用来进行变异计算的变量。上面这行代码将导致覆盖包含50多个列/变量的整个原始数据框(df),并只放回(targ_vars)中选定的6个变量加上中计算的新(targ_var_count)变量。

实际上,我只想关注最后一行变化,并将新的count列放回到原来的(df)中。

我尝试了下面的方法,但是当我调用"df$targcount"时,它最终给了我一个列表而不是只有一个rowSum列:

df$targcount <- df %>%
select(targ_vars) %>%
mutate(targcount = rowSums(!is.na(.), na.rm = TRUE))

任何帮助/提示将不胜感激。

您可以使用dplyr::across来获取targ_vars列的非NA值的计数。

使用一些假随机示例数据:

set.seed(123)
dat <- data.frame(
a = sample(c(0, NA), 10, replace = TRUE),
b = sample(c(0, NA), 10, replace = TRUE),
c = sample(c(0, NA), 10, replace = TRUE),
d = sample(c(0, NA), 10, replace = TRUE)
)
targ_vars <- c("c", "d")
library(dplyr, w = FALSE)
dat %>%
mutate(targcount = rowSums(across(all_of(targ_vars), ~ !is.na(.x))))
#>     a  b  c  d targcount
#> 1   0 NA  0  0         2
#> 2   0 NA NA NA         0
#> 3   0 NA  0  0         2
#> 4  NA  0  0 NA         1
#> 5   0 NA  0 NA         1
#> 6  NA  0  0  0         2
#> 7  NA NA NA  0         1
#> 8  NA  0 NA  0         1
#> 9   0  0  0  0         2
#> 10  0  0 NA NA         0

最新更新