R 仅在特定索引中连接数据帧的字符串行
假设我们有一个包含两列、一个字符、一个数字的数据框:R 仅在特定索引中连接数据帧的字符串行,r,concatenation,R,Concatenation,假设我们有一个包含两列、一个字符、一个数字的数据框: df <- data.frame(chr = letters[1:10], ind = c(NA, NA, 1, NA, NA, 2, NA, NA, 3, NA)) chr ind 1 a NA 2 b NA 3 c 1 4 d NA 5 e NA 6 f 2 7 g NA 8 h NA 9 i 3 10 j NA 如
df <- data.frame(chr = letters[1:10],
ind = c(NA, NA, 1, NA, NA, 2, NA, NA, 3, NA))
chr ind
1 a NA
2 b NA
3 c 1
4 d NA
5 e NA
6 f 2
7 g NA
8 h NA
9 i 3
10 j NA
如果没有for循环,您将如何执行此操作?好的,我知道了。诀窍是使用
zoo::na.locf
填充na
值,然后groupby
和paste
:
library(dplyr)
library(zoo)
df %>%
mutate(bool = is.na(ind), groupID = na.locf(ind, na.rm = FALSE)) %>%
filter(bool & !is.na(groupID)) %>% group_by(groupID) %>%
summarise(newChr = paste(chr, collapse = " ")) %>%
select(newChr)
你问了这个问题,在你想出解决方案的那一分钟内,你写下了下面所有的代码并发布在这里?不,我写了这个问题,然后认为我必须能够解决它,然后认为我的解决方案可能会对其他人有利,并发布了问题和答案。根据所谓的“法律”,这是错误的吗?告诉我,我会删除所有内容。这很公平。我不知道规则,只是有点困惑;)此外,根据“规则”,在两天过去之前,我不能接受自己的答案,我假设这样做是为了让其他人想出可能更好的解决方案。他们什么都想到了!是的,你在这里所做的一切都很正常。
library(dplyr)
library(zoo)
df %>%
mutate(bool = is.na(ind), groupID = na.locf(ind, na.rm = FALSE)) %>%
filter(bool & !is.na(groupID)) %>% group_by(groupID) %>%
summarise(newChr = paste(chr, collapse = " ")) %>%
select(newChr)