2017-10-07 50 views
1

比方说,我有以下数据形式的数据帧在R:总和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个属性中的第一行中有七次A,六次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 

或更糟的是,如果“A”是一次也没有n个属性中我得到的错误

Error in eval(expr, envir, enclos) : object 'A' not found 

什么是这里一个可能的解决方案?

回答

2

您可以使用lapplyrowSums来快速完成此操作。我只使用三个“属性”生成了一些假数据。

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 
+0

我知道必须有东西做,很容易。谢谢!正如后续:当一般单词而不是字母在单元格中时(例如“是”,“否”),是否可以通过TEST < - c(“是”,“否”)合并这些单词并替换在LAPTERS中LETTERS(LETTERS,函数(x)rowSums(df == x))与TEST? – Taufi

+0

@Taufi,应该工作得很好!你可以看到它:'test < - c(“Yes”,“No”); (Property1 = sample(test,6,replace = T),Property2 = sample(test,6,replace = T),Property3 = sample(test,6,replace = T)); df [,test] < - lapply(test,function(x)rowSums(df == x))' –