【问题标题】:Separate two columns delineated by semicolons into rows (R)将用分号划定的两列分隔为行 (R)
【发布时间】:2020-12-06 05:48:29
【问题描述】:

所以,我有两列,每列都有多个项目。它们用分号分隔。

我想将它们变成多行,新行根据原始行中的顺序进行匹配。

如果我只有一列,我会使用separate_rows,但我不知道如何处理需要匹配的两列。用一个例子更容易解释:

可重现的例子

AU <- c("Ali, PB; Naylor, JC", "Warren, EW; Stephens, D")
EM <- c("PatAllen@fake.com; JNaylor@fake.edu","LizWarren@fake.edu.au; Doug@fake.net")
question <- data.frame(AU, EM)

我希望数据框是这样的:

1 Ali, PB PatAllen@fake.com
2 Naylor, JC JNaylor@fke.edu
3 Warren, EW LizWarren@fake.edu.au
4 Stephens, D Doug@fake.net

【问题讨论】:

  • 您可以使用:splitstackshape::cSplit(question, c('AU', 'EM'), sep = ';', direction = "long")

标签: r tidyr


【解决方案1】:

tidyr 包来救援! separate_rows() 是一个新的 (?) 函数,可以完全满足您的需求。

tidyr::separate_rows(question, AU, EM, sep = ";", convert = T)

【讨论】:

  • 啊,我明白了:我没有意识到分开的行足够灵活地处理两列。接受的答案:)
【解决方案2】:

如果您不想使用 Ben 的漂亮 tidyverse 公式,并且如果您的数据总是在同一位置匹配姓名和电子邮件,您也可以使用 for 循环来做到这一点

AU <- c("Ali, PB; Naylor, JC", "Warren, EW; Stephens, D")
EM <- c("PatAllen@fake.com; JNaylor@fake.edu","LizWarren@fake.edu.au; Doug@fake.net")
question <- data.frame(AU, EM, stringsAsFactors = FALSE)

df <- data.frame(name=c(), email=c())
for(r in 1:nrow(question)){
  a <- strsplit(question[r,1], "; ")[[1]]
  e <- strsplit(question[r,2], "; ")[[1]]
  
  df <- rbind(df, data.frame(name=a, email=e))
}
df

如果您需要加快速度,甚至可以将其矢量化:

x <- apply(question, 2, strsplit, "; ")
matrix(unlist(x), ncol=2)

另外,请注意用“;”而不是“;”分隔,因为数据中每个单元格的第二部分由空白字符引导

【讨论】:

    猜你喜欢
    • 2015-04-27
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多