r dplyr 结合 mutate_at, vars(ends_with), ifelse, !is.na
r dplyr combining mutate_at, vars(ends_with), ifelse, !is.na
您好,我有 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`
和 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))
它returns
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")))))
您好,我有 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`
和 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))
它returns
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")))))