嗨,我有10个变量具有相同的结尾,我正在尝试使用mutate_at在这些变量中基于数据的新变量创建一个新变量,并将其分配回DataFrame。如果任何带有" 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 vars均为na,则值为na,或者如果任何_xyz vars都不是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`
使用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")))))