R:根据另一列中的值从一列中的拆分字符串中检索数据
R: Retrieve data from split string in a column based on value in another column
我有一个非常大的数据框,例如:
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是"dependency"中的第二个和第三个元素。 "tokens" 中的第二个和第三个元素是 "des ärgerlichen.
我试过拆分和 str_split,但不知道如何处理结果元素。
我们可以使用 base R
方法来创建第 4 列。
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"
一种选择是将数据拆分为 "long" 形式。有几种方法可以做到这一点,其中之一是使用我的 "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
我有一个非常大的数据框,例如:
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是"dependency"中的第二个和第三个元素。 "tokens" 中的第二个和第三个元素是 "des ärgerlichen.
我试过拆分和 str_split,但不知道如何处理结果元素。
我们可以使用 base R
方法来创建第 4 列。
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"
一种选择是将数据拆分为 "long" 形式。有几种方法可以做到这一点,其中之一是使用我的 "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