嗨,我有10个具有相同结尾的变量,我尝试使用mutate_at根据这些变量中的数据创建一个新变量,并将其分配回数据框。如果任何以“ xyz”结尾的变量都有数据(即不是NA),那么我想分配值的计数,否则要分配NA的值。
df %<>% mutate_at(vars(ends_with("xyz")), funs(new_var = ifelse(!is.na(), 1, NA)))
上面的代码给出一个错误,要求!is.na()带有参数,但是vars参数需要一个函数。我该如何结合呢?
编辑:这是可复制的示例和所需的输出:
`# A tibble: 6 x 6
1_abc 1_xyz 2_abc 2_xyz 3_abc 3_xyz
1 NA 1 NA 1 NA NA
2 NA NA NA NA NA NA
3 NA NA NA 1 NA NA
4 NA NA NA NA NA NA
5 NA NA NA NA NA NA
6 NA 1 NA NA NA NA`
所需的输出将是一个变量,例如xyz_num,如果所有_xyz变量都为NA,则值将为NA;如果任何_xyz变量都不为NA,则非空变量的计数。
`# A tibble: 6 x 7
1_abc 1_xyz 2_abc 2_xyz 3_abc 3_xyz xyz_num
1 NA 1 NA 1 NA NA 2
2 NA NA NA NA NA NA NA
3 NA NA NA 1 NA NA 1
4 NA NA NA NA NA NA NA
5 NA NA NA NA NA NA NA
6 NA 1 NA NA NA NA 1`
答案 0 :(得分:1)
使用dplyr
,您可以尝试
df1 %>%
select(ends_with("_xyz")) %>%
mutate(nnums = rowSums(!is.na(.)))
假设输入为
structure(list(X1_abc = c(NA, NA, NA, NA, NA, NA), X1_xyz = c(1,
NA, NA, NA, NA, 1), X2_abc = c(NA, NA, NA, NA, NA, NA), X2_xyz = c(1,
NA, 1, NA, NA, NA), X3_abc = c(NA, NA, NA, NA, NA, NA), X3_xyz = c(NA,
NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA,
-6L))
它返回
X1_xyz X2_xyz X3_xyz nnums
1 1 1 NA 2
2 NA NA NA 0
3 NA 1 NA 1
4 NA NA NA 0
5 NA NA NA 0
6 1 NA NA 1
我希望您可以在代码周围进行修改,以保留所需的列。
编辑1:
要保留所有列,请尝试
df1 %<>%
mutate(nnums = rowSums(!is.na(select(df1, ends_with("_xyz")))))