2014-11-03 64 views
-1

如何在一行中搜索特定值。例如,該數據r行中的搜索值

a <- c("a", "a", "b", "c") 
b <- c("b", "a", "b", "d") 
c <- c("c", "a", "b", "c") 
d <- c("a", "a", "b", "a") 
x <- data.frame(cbind(a,b,c,d)) 
head(x) 

我想知道是否有一個「A」,「B」,「C」,或「d」的第一排。最佳結果看起來像附加的列表示每行中有多少個。再次

謝謝!

+1

請包括您想要的示例輸出 – janos 2014-11-03 20:37:37

回答

3

什麼你也可以這樣做:

library(reshape2) 
df1 <- as.data.frame.matrix(table(melt(as.matrix(x))[,c(1,3)])) 
cbind(x,df1) 
# a b c d a b c d 
#1 a b c a 2 1 1 0 
#2 a a a a 4 0 0 0 
#3 b b b b 0 4 0 0 
#4 c d c a 1 0 2 1 
0

你的意思是這樣嗎?並不完全清楚自己想要的輸出看起來像

x$A <- apply(x,1,function(x) length(grep("a",x))) 
x$B <- apply(x,1,function(x) length(grep("b",x))) 
x$C <- apply(x,1,function(x) length(grep("c",x))) 
x$D <- apply(x,1,function(x) length(grep("d",x))) 

> x 
a b c d A B C D 
1 a b c a 2 1 1 0 
2 a a a a 4 0 0 0 
3 b b b b 0 4 0 0 
4 c d c a 1 0 2 1 
1

另一種方法堅持基地:

f<-function(x) table(factor(unlist(x),levels=letters[1:4])) 
df1<-t(apply(x,1,f)) 
cbind(x,df1) 

    a b c d a b c d 
1 a b c a 2 1 1 0 
2 a a a a 4 0 0 0 
3 b b b b 0 4 0 0 
4 c d c a 1 0 2 1 
1

到JR的答案類似,但有點不同:

s <- split(unlist(x), rep.int(seq_len(nrow(x)), nrow(x)))  
cbind(x, do.call(rbind, Map(table, s))) 
# a b c d a b c d 
# 1 a b c a 2 1 1 0 
# 2 a a a a 4 0 0 0 
# 3 b b b b 0 4 0 0 
# 4 c d c a 1 0 2 1 

vapply實際上可能會更好(更快):

cbind(x, t(vapply(s, table, integer(4L)))) 
# a b c d a b c d 
# 1 a b c a 2 1 1 0 
# 2 a a a a 4 0 0 0 
# 3 b b b b 0 4 0 0 
# 4 c d c a 1 0 2 1