2017-04-05 68 views
1

应用规则到数据帧获得第一优先我有包括不同层次的选择,数据帧:如何通过R中

df = read.table(text="Index V1 V2 V3 V4 V5 
    1 A A A B A 
    2 B B B B B 
    3 B C C B B 
    4 B B C D E 
    5 B B C C D 
    6 A B B B B 
    7 C C B D D 
    8 A B C D E", header=T, stringsAsFactors=F) 

我想创造另一列来保存最广为接受的选择。每一行。如果有多个选项,请采取最大出现次数。如果最大数量大于1,则以出现的最大次数进行第一次选择。所以我的结果是:

Index V1 V2 V3 V4 V5 final 
    1 A A A B A A 
    2 B B B B B B 
    3 B C C B B B 
    4 B B C D E B 
    5 B B C C D B 
    6 A B B B B B 
    7 C C B D D C 
    8 A B C D E A 

感谢您的帮助。

回答

1

我们可以通过使用table来找到每行中的值的频率。遍历数据集的除第一列(applyMARGIN = 1)行,得到的频率与table,找到最大频率(which.max)的索引,并获得对应于最大频率

df$final <- apply(df[-1], 1, FUN = function(x) { 
      tbl <- table(factor(x, levels = unique(x))) 
      names(tbl)[which.max(tbl)]}) 
df$final 
#[1] "A" "B" "B" "B" "B" "B" "C" "A" 
2
apply(df[,-1], 1, function(x) 
     x[which.max(ave(rep(1, length(x)), x, FUN = sum))]) 
#[1] "A" "B" "B" "B" "B" "B" "C" "A" 

df[7,2:6] = c("D", "C", "B", "C", "D") 
apply(df[,-1], 1, function(x) 
     x[which.max(ave(rep(1, length(x)), x, FUN = sum))]) 
#[1] "A" "B" "B" "B" "B" "B" "D" "A" 
names
+0

如果第7行变为“DCBCD”,则结果为“A”“B”“B”“B”“B”“B”“C”“A”。期望是“A”“B”“B”“B”“B”“B”“D”“A”。 – user3354212

+0

@ user3354212,它现在应该工作 –