我有一个大的数据框架(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