gpt4 book ai didi

r - 如果存在,则从多列中填充新列

转载 作者:行者123 更新时间:2023-12-04 00:13:29 26 4
gpt4 key购买 nike

示例数据帧:

df <- data.frame(col_1=c("A", NA, NA), col_2=c(NA, "B", NA), col_3=c(NA, NA, "C"), other_col=rep("x", 3), stringsAsFactors=F)
df
col_1 col_2 col_3 other_col
1 A <NA> <NA> x
2 <NA> B <NA> x
3 <NA> <NA> C x

我可以创建一个新列 new_col 填充来自 3 列 col_1col_2col_3< 的非 NA 值:

df %>% 
mutate(new_col = case_when(
!is.na(col_1) ~ col_1,
!is.na(col_2) ~ col_2,
!is.na(col_3) ~ col_3,
TRUE ~ "none"))

col_1 col_2 col_3 other_col new_col
1 A <NA> <NA> x A
2 <NA> B <NA> x B
3 <NA> <NA> C x C

但是,有时我从中选择 new_col 值的列数可能会有所不同。

如何在应用之前的 case_when 命令之前检查列是否存在?

以下触发错误:

df %>% 
select(-col_3) %>%
mutate(new_col = case_when(
!is.null(.$col_1) & !is.na(col_1) ~ col_1,
!is.null(.$col_2) & !is.na(col_2) ~ col_2,
!is.null(.$col_3) & !is.na(col_3) ~ col_3,
TRUE ~ "none"))

Error: Problem with `mutate()` input `new_col`.
x object 'col_3' not found
ℹ Input `new_col` is `case_when(...)`.

最佳答案

我喜欢亚当的回答,但如果您希望能够从 col_1col_2 组合(假设它们都有值),您应该使用 unite ()

library(tidyverse)
df %>%
unite(new_col, starts_with("col"), remove = FALSE, na.rm = TRUE)

编辑以回应:“我如何在应用前一个 case_when 命令之前检查列是否存在?”

您无需使用此命令进行检查。如果要合并的列的命名不一致,请将 starts_with("col") 替换为 c("your_name_1", "your_name_2", "etc.")

关于r - 如果存在,则从多列中填充新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66158139/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com