【问题标题】:R: Retrieve data from split string in a column based on value in another columnR:根据另一列中的值从列中的拆分字符串中检索数据
【发布时间】:2015-12-20 11:04:19
【问题描述】:

我有一个非常大的数据框,例如:

df = data.frame(nr = c(3,3,4), dependeny = c("6/3/1", "9/3/1",
  "5/4/4/1"), token=c("Trotz des Rückgangs", 
  "Trotz meherer Anfragen", "Trotz des ärgerlichen Unentschiedens"))

  nr dependeny                                token
1  3     6/3/1                  Trotz des Rückgangs
2  3     9/3/1               Trotz meherer Anfragen
3  4   5/4/4/1 Trotz des ärgerlichen Unentschiedens

我想根据“nr”和“dependency”中的值添加第 4 列,其中包含“token”的摘录。更准确地说,我想要来自“token”的元素,它们对应于“dependency”中对应于“nr”的值。

示例: 第 1 行: 我想要“des”,因为“nr”是 3,而 2 是“dependency”中的第二个元素。 “token”中的第二个元素是“des”。

第 3 行: 我想要“des ärgerlichen”,因为“nr”是 4,而 4 是“依赖”中的第二个和第三个元素。 “tokens”中的第二个和第三个元素是“des ärgerlichen”。

我尝试过使用 split 和 str_split,但不知道如何处理结果元素。

【问题讨论】:

  • 第二行是meherer吗?
  • 或与data.table:setDT(df)[,paste(strsplit(as.character(token), ' ')[[1]][unlist(gregexpr(nr, gsub('/','',dependeny)))], collapse=' '),token]

标签: r split strsplit


【解决方案1】:

我们可以使用base R 方法来创建第四列。

unlist(Map(function(x,y,z) paste(z[x==y], collapse=' '), 
         df$nr,strsplit(as.character(df$dependeny), '/'), 
            strsplit(as.character(df$token), ' ')))
#[1] "des"             "meherer"         "des ärgerlichen"

【讨论】:

  • 谢谢,但如果我使用给定的示例,我会收到一个错误:mapply 中的错误(FUN = f,...,SIMPLIFY = FALSE):不能混合零长度输入与那些非零长度。我没有足够的知识来发现错误。你能帮我吗?干杯。
  • @Simone 你用的是同一个例子吗?我没有收到任何错误。
  • 发现问题:重新启动 R 以确保没有加载任何包,现在可以正常工作了。
【解决方案2】:

一种选择是将数据拆分为“长”形式。有几种方法可以做到这一点,其中之一是使用我的“splitstackshape”包中的cSplit

library(splitstackshape)
cSplit(as.data.table(df)[, rn := .I], 
       c("dependeny", "token"), c("/", " "), "long")[nr == dependeny]
#    nr dependeny       token rn
# 1:  3         3         des  1
# 2:  3         3     meherer  2
# 3:  4         4         des  3
# 4:  4         4 ärgerlichen  3

请注意,我已经添加了行号。如果需要,这允许我们将内容重新粘贴在一起:

cSplit(as.data.table(df)[, rn := .I],                   ## Adds row numbers
       c("dependeny", "token"), c("/", " "), "long")[   ## Splits the data into rows
         nr == dependeny][                              ## Selects the values of interest
         , paste(token, collapse = " "), by = rn]       ## Pastes the token values together
#    rn              V1
# 1:  1             des
# 2:  2         meherer
# 3:  3 des ärgerlichen

【讨论】:

  • 谢谢,但我对 akrun 的答案投了票,因为它使用基础 R。
猜你喜欢
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多