r - dplyr:group_by 和汇总以折叠(通过串联)包含 NA 的字符串列

标签 r dplyr summarize

我有一个相对简单的问题,我一直无法找到解决方案。
假设我有以下数据集:


ID
虚拟变量
字符串 1
字符串2
字符串 3


1
0
汤姆
不适用
不适用

1
1
不适用

不适用

2
0
汤姆
不适用
不适用

2
1
不适用

不适用

2
0
不适用
不适用
鲍勃

3
0
史蒂夫
不适用
不适用

3
0
不适用
蒂米
不适用

4
0
亚历克斯
不适用
不适用


我想使用 group by 和 summary 来获得以下内容:


ID
虚拟变量
字符串 1
字符串2
字符串 3


1
1
汤姆

不适用

2
1
汤姆

鲍勃

3
0
史蒂夫
蒂米
不适用

4
0
亚历克斯
不适用
不适用


我对“dummy_var”没有任何问题,在汇总函数中使用了 dummy_var = max(dummy_var) 的变体,但我似乎找不到任何关于如何根据需要获取字符串的信息。
我尝试过类似的变体:

group_by(ID) %>%
summarize(
String1 = str_c(String1)
)
或者
group_by(ID) %>%
summarize(
String1 = case_when(
     length(str_c(String1)) > 0 ~ str_c(String1)
     str_c(String1) == rep(NA,length(str_c(String1)) ~ NA
     )
)
第一次尝试时,行实际上并没有改变。例如,尽管诸如 max(dummy var) 之类的数字运算将为组中的每一行产生预期的 0 或 1,但不会汇总字符串变量,并且在取消分组和打印数据框时,每个 ID 会得到多行,就好像您从来没有总结过字符串列。
使用第二种方法,当每个组的所有值都是 NA 的情况下,函数总是失败,说“String(i) 的长度必须大于 0”或它的一些变体。
我注意到如果我尝试以下
group_by(ID) %>%
summarize(
String1 = str_replace_na(String1)
)
输出和第一个代码块一样,好像什么都没发生。
关于我的数据的其他事实:每组字符串 1 将始终具有至少一个没有 NA 的值。对于 String2 和 String 3,有许多包含每个组的所有 NA,我希望折叠的行也读取 NA,根据我的示例。此外,在任何情况下,任何 group_by() 组都没有包含多于一行的列包含 NA 以外的内容;即,在组内,每行只有三个 String1/2/3 之一作为 NA 以外的其他内容,或者它们可能都是 NA(例如在我的示例中 ID=2)。包含 int 或 double 值的所有其他列汇总没有问题。这只是字符串。使用 paste0 代替 str_c() 也没有区别。
任何人都可以给我建议吗?我在网上找不到任何这样的例子,其中 NA 在组内的列内,以及在组内的位置,它们有时包含列内的所有值。
我唯一的选择是在所有 NA 上使用 replace_na(),将它们与一些填充文本连接起来,然后返回并为每个值使用 stringr 或其他东西将它们取出。它有效,但我知道必须有一种优雅的方法!
编辑:
事实证明,如果我使用 str_replace_na() 而不是 str_c(),你最终会得到,例如,


ID
虚拟变量
字符串 1
字符串2
字符串 3


1
1
汤姆
“不”
“不”

1
1
“不”
“乔”
“不”

2
1
汤姆
“不”
“不”

2
1
“不”
“乔”
“不”

2
1
“不”
“不”
鲍勃


也就是说,这些值被替换为字符串“NA”而不是 NA。鉴于以下情况,这是令人惊讶的:
str_replace_na("Something",NA)
> "Something"
str_c("Something",NA)
> NA

最佳答案

您可以使用 tidyrfill -功能:

library(tidyr)
library(dplyr)

df %>% 
  group_by(ID) %>% 
  fill(starts_with("String"), .direction="downup") %>% 
  filter(dummy_var == max(dummy_var)) %>% 
  distinct() %>% 
  ungroup()
返回
# A tibble: 4 x 5
     ID dummy_var String1 String2 String3
  <dbl>     <dbl> <chr>   <chr>   <chr>  
1     1         1 Tom     Jo      NA     
2     2         1 Tom     Jo      Bob    
3     3         0 Steve   Timmy   NA     
4     4         0 Alex    NA      NA   
##数据
df <- structure(list(ID = c(1, 1, 2, 2, 2, 3, 3, 4), dummy_var = c(0, 
1, 0, 1, 0, 0, 0, 0), String1 = c("Tom", NA, "Tom", NA, NA, "Steve", 
NA, "Alex"), String2 = c(NA, "Jo", NA, "Jo", NA, NA, "Timmy", 
NA), String3 = c(NA, NA, NA, NA, "Bob", NA, NA, NA)), class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -8L), spec = structure(list(
    cols = list(ID = structure(list(), class = c("collector_double", 
    "collector")), dummy_var = structure(list(), class = c("collector_double", 
    "collector")), String1 = structure(list(), class = c("collector_character", 
    "collector")), String2 = structure(list(), class = c("collector_character", 
    "collector")), String3 = structure(list(), class = c("collector_character", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1L), class = "col_spec"))

关于r - dplyr:group_by 和汇总以折叠(通过串联)包含 NA 的字符串列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68460000/

相关文章:

r 按 ID 的最小最大日期和 ID 内的多个状态更改

r - groupby 并删除 r 数据框中的最低值

arrays - 将矩阵添加到 R 中的列表

mysql - 将数据框中的一行数据直接插入到 R 中的数据库中

sql - 如何在 SQL 数据库上使用 dplyr `distinct()` 函数?

python pandas 总结标称变量(计数)

r - 如何通过将现有行的值与 R dplyr 组合来将行添加到数据帧

r - 根据每组的另一个查找表有条件地为一个数据框插入值?

r - 代码无法使用 R 中 purrr 包中的 map 工作

r - 使用带有 dplyr 的向量汇总列