我有一个包含分组名称的数据框,如下所示:
<div class="chat_widget_body">
<div class="chat_widget_bubble_green"> Too much headache since last night. Please guide me
<div class="msg_time">Today | 11:00 am <i class="fa fa-check" aria-hidden="true"></i></div>
</div>
<div class="chat_widget_notification">Payment of Rs. 330.00 Received</div>
</div>
<div class="chat_widget_footer"></div>
我想将其转换为一个列在组名称上并包含名称的列表。示例输出:
df <- data.frame(group = rep(letters[1:2], each=2),
name = LETTERS[1:4])
> df
group name
1 a A
2 a B
3 b C
4 b D
这是not a new question,但我想在整齐的范围内完成这项工作。
答案 0 :(得分:9)
据我所知,在tidyverse中还没有这样的功能。因此,您必须自己编写:
split_tibble <- function(tibble, col = 'col') tibble %>% split(., .[,col])
然后:
dflist <- split_tibble(df, 'group')
导致数据帧的出现:
> dflist
$a
group name
1 a A
2 a B
$b
group name
3 b C
4 b D
> sapply(dflist, class)
a b
"data.frame" "data.frame"
要获得所需的输出,您必须稍微扩展一下这个功能:
split_tibble <- function(tibble, column = 'col') {
tibble %>% split(., .[,column]) %>% lapply(., function(x) x[,setdiff(names(x),column)])
}
现在:
split_tibble(df, 'group')
结果:
$a
[1] A B
Levels: A B C D
$b
[1] C D
Levels: A B C D
考虑到评论和答案中的备选方案,得出以下结论:使用基础R替代split(df$name, df$group)
更为明智。
答案 1 :(得分:1)
使用tidyverse
library(tidyr)
library(dplyr)
df$ID<-1:nrow(df) #unique variable
lst<-df%>%spread(group,name)%>%select(-ID)%>%as.list()
lapply(lst,function(x)x[!is.na(x)]