【问题标题】:R - split strings in a list of data framesR - 在数据帧列表中拆分字符串
【发布时间】:2018-01-22 07:01:36
【问题描述】:

我以前从未在 R 中使用过数据框列表。也许它甚至不复杂,但我现在无法自拔。

所以我得到了一个数据框列表

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 的各个数据帧中

最后我希望我的数据框看起来像这样

    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)

但在使用 splitfuction 时会出现问题! 请帮帮我

【问题讨论】:

  • 谢谢,将库'stringr'包含到代码中
  • 一匹有守护的小马是怎么出现的? ://
  • 修复,小马守护者问题

标签: r list dataframe split


【解决方案1】:

使用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 的每个元素。

编辑:

如果你想要三个不同的列,你应该使用:

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

【讨论】:

    【解决方案2】:

    使用lapplytidy::separatedo.call 函数,您可以:

    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
    

    【讨论】:

    • 如果你打算将最终结果做成一个大数据框(这似乎不是 OP 想要的),那么你应该使用bind_rows,即bind_rows(ldf) %&gt;% separate(v6,c("col1","col2","col3"), sep = "\\|", remove=FALSE) %&gt;% select(-c(col1, col3))。我还添加了另一个选择语句来删除不需要的列
    猜你喜欢
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2023-03-31
    • 2023-01-21
    相关资源
    最近更新 更多