【发布时间】:2021-09-28 06:26:48
【问题描述】:
我有一个相对简单的问题,但我一直找不到解决方案。
假设我有以下数据集:
| ID | dummy_var | String1 | String2 | String3 |
|---|---|---|---|---|
| 1 | 0 | Tom | NA | NA |
| 1 | 1 | NA | Jo | NA |
| 2 | 0 | Tom | NA | NA |
| 2 | 1 | NA | Jo | NA |
| 2 | 0 | NA | NA | Bob |
| 3 | 0 | Steve | NA | NA |
| 3 | 0 | NA | Timmy | NA |
| 4 | 0 | Alex | NA | NA |
我想使用 group by 和 summarise 来获得以下信息:
| ID | dummy_var | String1 | String2 | String3 |
|---|---|---|---|---|
| 1 | 1 | Tom | Jo | NA |
| 2 | 1 | Tom | Jo | Bob |
| 3 | 0 | Steve | Timmy | NA |
| 4 | 0 | Alex | NA | NA |
我对“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 | dummy_var | String1 | String2 | String3 |
|---|---|---|---|---|
| 1 | 1 | Tom | "NA" | "NA" |
| 1 | 1 | "NA" | "Jo" | "NA" |
| 2 | 1 | Tom | "NA" | "NA" |
| 2 | 1 | "NA" | "Jo" | "NA" |
| 2 | 1 | "NA" | "NA" | Bob |
也就是说,这些值被替换为字符串“NA”而不是 NA。鉴于以下情况属实,这令人惊讶:
str_replace_na("Something",NA)
> "Something"
str_c("Something",NA)
> NA
【问题讨论】: