【发布时间】:2015-04-02 09:42:05
【问题描述】:
我有一个数据框df,其中包含几列,但下面给出了唯一相关的列。
node | precedingWord
-------------------------
A-bom de
A-bom die
A-bom de
A-bom een
A-bom n
A-bom de
acroniem het
acroniem t
acroniem het
acroniem n
acroniem een
act de
act het
act die
act dat
act t
act n
我想使用这些值来计算每个节点的precedingWords,但带有子类别。例如:要添加值的一列标题为neuter,另一列为non-neuter,最后一列为rest。 neuter 将包含所有值,previousWord 是以下值之一:t,het,dat。 non-neuter 将包含 de 和 die, 和 rest 将包含不属于 neuter 或 non-neuter 的所有内容。 (如果这可以是动态的,那就太好了,换句话说,rest 使用了某种用于中性和非中性的反转变量。或者只是从长度中减去中性和非中性的值具有该节点的行。)
示例输出(在一个新的数据帧中,比如说freqDf,看起来像这样:
node | neuter | nonNeuter | rest
-----------------------------------------
A-bom 0 4 2
acroniem 3 0 2
act 3 2 1
要创建freqDf$node,我可以这样做:
freqDf<- data.frame(node = unique(df$node), stringsAsFactors = FALSE)
但这已经是我的全部了;我不知道如何继续。我想我可以做这样的事情,但不幸的是 ++ 运算符没有像我希望的那样工作。
freqDf$neuter[grep("dat|het|t", df$precedingWord, perl=TRUE)] <- ++
freqDf$nonNeuter[grep("de|die", df$precedingWord, perl=TRUE)] <- ++
e <- table(df$Node)
freqDf$rest <- as.numeric(e - freqDf$neuter - freqDf$nonNeuter)
此外,这不适用于单独的每个节点。我需要某种循环,自动为freqDf$node 中的每个不同值运行。
【问题讨论】:
-
一个丑陋的解决方案
data.table:dt<-as.data.table(df);dt[,list(neuter=sum(precedingWord %in% c("t","het","dat")),nonNeuter=sum(precedingWord %in% c("de","die")),rest=sum(!precedingWord %in% c("t","het","dat","de","die"))),by=node]. -
@nicola 我收到回复 dat
as.data.tableis not a function。 -
对不起,我没有指定你需要
data.table包。安装它,然后把require(data.table)放在我写的上面。