2017-08-14 62 views
2

我从来没有使用过R中的数据帧列表。也许它并不复杂,但我现在无法自拔。R - 数据帧列表中的拆分字符串

所以我就dataframes

df1 <- data.frame(v5 = c(0.5,0.6,0.7,0.96),v6 = c("Tiny|Marsian|Worker", "Tiny|Human|Student", "Tiny|Goblin|Soldier", "Tiny|Horse|Guardian")) 
df2 <- data.frame(v5 = c(0.56,0.32,0.55),v6 = c("Tiny|Human|Worker", "Tiny|Marsian|Student", "Tiny|Goblin|Soldier")) 

ldf <- list(df1,df2) 

每个数据帧包含6列(在这种情况下,只有2)和行的不同之每个的数量df的列表。 列V6包含三个不同的信息,每个信息由“管道” 我现在需要做的是通过“管道”分割这些信息,并制作三个单独的列。正如我会把它弄了一个DF出

library(stringr) 
split = str_split_fixed(string = df1$v6, pattern = "\\|", n = 3) 

此后,我想追加现在在列2结束回到LDF

的个人dataframes到底的信息我希望我的数据框看起来像这样

df1 <- data.frame(v5 = c(0.5,0.6,0.7,0.96), 
v6 = c("Tiny|Marsian|Worker", "Tiny|Human|Student", "Tiny|Goblin|Soldier", "Tiny|Horse|Guardian"), 
v7=c("Marsian","Human","Goblin","Horse")) 
    df2 <- data.frame(v5 = c(0.56,0.32,0.55), 
v6 = c("Tiny|Human|Worker", "Tiny|Marsian|Student", "Tiny|Goblin|Soldier", 
v7 = c("Human", "Marsian", "Goblin"))) 

我该如何实现这一目标?我已经尝试了几件事

x <- lapply(ldf, `[`, 6) 

但使用splitfuctions时出现问题! 请帮我

+0

Thx,将图书馆的'字符串'包含在代码中 –

+1

带监护人的小马是怎么出现的? :/ – Sotos

+0

固定,小马守护问题 –

回答

0

随着dplyrpurrr

library('dplyr') 
library('purrr') 
ldf2 <- map(ldf, mutate, v7 = str_split_fixed(string = v6, pattern = "\\|", n = 3)[, 2]) 

ldf2 

[[1]] 
    v5     v6  v7 
1 0.5 Tiny|Marsian|Worker Marsian 
2 0.6 Tiny|Human|Student Human 
3 0.7 Tiny|Goblin|Soldier Goblin 

[[2]] 
    v5     v6  v7 
1 0.56 Tiny|Human|Worker Human 
2 0.32 Tiny|Marsian|Student Marsian 
3 0.55 Tiny|Goblin|Soldier Goblin 

mutate()增加了新列基于字符串分割data.frame,并map()正在申请这个mutate()ldf每个元素。

编辑:

如果你想三个不同的列,建议立即进行删除使用:随着lapplytidy::separatedo.call功能

ldf2 <- map(ldf, separate, col = 'v6', into = c('Col1', 'Col2', 'Col3'), sep = '\\|') 
+0

按预期完美运作。 –

0

你可以这样做:

combinedDF = do.call(rbind,lapply(ldf,function(x) { 

x %>% 
tidyr::separate(v6,c("v70","v7","v72"), sep = "\\|", remove=FALSE) %>% 
dplyr::select(-c(v70,v72)) 

})) 

没有lapply/rbind (感谢@Sotos)

bind_rows(ldf) %>% 
tidyr::separate(v6,c("v70","v7","v72"), sep = "\\|", remove=FALSE) %>% 
select(-c(v70, v72)) 


combinedDF 
# v5     v6  v7 
#1 0.50 Tiny|Marsian|Worker Marsian 
#2 0.60 Tiny|Human|Student Human 
#3 0.70 Tiny|Goblin|Soldier Goblin 
#4 0.56 Tiny|Human|Worker Human 
#5 0.32 Tiny|Marsian|Student Marsian 
#6 0.55 Tiny|Goblin|Soldier Goblin 
+0

如果你打算让最后的结果成为一个大数据框(它似乎不是OP想要的),那么你应该使用'bind_rows',即'bind_rows(ldf)%>%separate(v6,c(“ col1“,”col2“,”col3“),sep =”\\ |“,remove = FALSE)%>%select(-c(col1,col3))'。我还添加了另一个选择语句以删除不需要的列 – Sotos

+0

谢谢,包括编辑 – OdeToMyFiddle

相关问题