假设我在R中的数据框中有以下数据形式:
Property 1 | Property 2 | ... | Property n
A B R
C A S
D F C
. . .
. . .
. . .
R Z X
其中任何单元格中的每个n属性都可以采用字母A到Z中的任何一个。现在,我想要的是计算每一行中26个字母中出现的任何一个字母的次数并给我属性n旁边的新列中的该数字。因此,例如,在n个属性中的第一行中有7次A,6次B,0次C等,代码给出了下表
Property 1 | Property 2 | ... | Property n | A | B | C | ... | Z
A B R 7 6 0 | ... | 2
C A S
D F C
. . .
. . .
. . .
R Z X
R中有功能吗?尽管它很慢,但我认为我可以在每个字母上写一些循环,然后以
的形式排。x <- vector(length=nrow(tr))
for (i in 1:nrow(tr)) {
x[i] <- count(tr[i,], vars="A")
}
但后来我收到了错误
Error in unique.default(x) :
unique() can only be applied to vectors
或更糟糕的是,如果&#34; A&#34;我得到错误的n个属性中甚至没有一次
Error in eval(expr, envir, enclos) : object 'A' not found
这里有什么可能的解决方案?
答案 0 :(得分:2)
您可以使用lapply
rowSums
来快速完成此操作。我只使用三个“属性”生成了一些假数据。
set.seed(1)
df <- data.frame(Property1 = sample(LETTERS, 6), Property2 = sample(LETTERS, 6), Property3 = sample(LETTERS, 6))
df[,LETTERS] <- lapply(LETTERS, function(x) rowSums(df==x))
结果的片段如下:
df[,c(1:6)]
Property1 Property2 Property3 A B C
1 J G M 0 0 0
2 T J O 0 0 0
3 W A L 1 0 0
4 E I E 0 0 0
5 O T S 0 0 0
6 C H Y 0 0 1