【问题标题】:String split and duplicate row in R?R中的字符串拆分和重复行?
【发布时间】:2016-05-14 07:37:11
【问题描述】:

我有一个数据库如下:

col1 <-c("X1",";X2","X3;X4;X5","X6;X7")
[1] "X1"       ";X2"      "X3;X4;X5" "X6;X7" 
col2 = col3 = col4 <- c("5","8","4","1")
[1] "5" "8" "1" "4"
dat <- data.frame(col1,col2,col3,col4)
 dat
      col1 col2 col3 col4
1       X1    5    5    5
2      ;X2    8    8    8
3 X3;X4;X5    4    4    4
4    X6;X7    1    1    1

我想删除第 1 列中的分号,如果第 1 列包含超过一个 X,它将复制新行。 此外,第 2 列和第 3 列将重复值,第 4 列将替换为值 0。我希望它会是:

dat
  col1 col2 col3 col4
1   X1    5    5    5
2   X2    8    8    8
3   X3    4    4    4
4   X4    4    4    0
5   X5    4    4    0
6   X6    1    1    1
7   X7    1    1    0

【问题讨论】:

  • 请不要引用数值。它将被读取为factor/character 列,具体取决于您是否指定stringsAsFactors=TRUE/FALSE

标签: r split duplicates rbind


【解决方案1】:

这会将col1 用分号拆分,并使用tidyr 的unnest 根据需要将单行分解为多行。接下来,它使用filter 删除由前导(或尾随或多个)分号生成的不需要的行。 tidyr 将col1 放在最后,所以我们使用select 重新排列。或者,如果列顺序无关紧要,只需省略 select

library(dplyr)
library(tidyr)

   dat %>%
       mutate(col1 = strsplit(as.character(col1), ";")) %>%
       unnest(col1) %>%
       filter(col1 != "") %>%
       select(col1, col2:col4)

给予:

Source: local data frame [7 x 4]

       col1   col2   col3   col4
      (chr) (fctr) (fctr) (fctr)
    1    X1      5      5      5
    2    X2      8      8      8
    3    X3      4      4      4
    4    X4      4      4      4
    5    X5      4      4      4
    6    X6      1      1      1
    7    X7      1      1      1

【讨论】:

  • 你可以指定fixed = TRUE来加快速度
  • 谢谢先生......现在只是一个更新,unnest需要一个cols参数:unnest(cols = col1)
【解决方案2】:

我们可以使用cSplit

library(splitstackshape)
cSplit(dat, "col1", ";", "long")[col1!=""][duplicated(col4), col4 := as.numeric(0)][]
#    col1 col2 col3 col4
#1:   X1    5    5    5
#2:   X2    8    8    8
#3:   X3    4    4    4
#4:   X4    4    4    0
#5:   X5    4    4    0
#6:   X6    1    1    1
#7:   X7    1    1    0

数据

col2 = col3 = col4 <- c(5,8,4,1)
 dat <- data.frame(col1,col2,col3,col4)

【讨论】:

  • 请帮帮我,如果 col1 只包含像 "" 或 NA 这样的字母,它将删除该行。我怎么能保留这些行?谢谢。
  • @MinhPhúcHuỳnh 你能用新案例和预期输出更新你的帖子吗?
猜你喜欢
  • 1970-01-01
  • 2014-10-13
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
相关资源
最近更新 更多