如何根据另一列上的选择条件从列中选择值?

时间:2011-09-23 17:06:34

标签: r

如何根据另一列中的值的频率(重复次数)从列中选择值/名称。在R?

这是我的样本数据..:

 Col1   col2  Col3  Col4 
 Yuva    123  qwe   XXYY
 Arun    234  asd   XYXY
 Yuva    870  ghj   XXYX
 Naan    890  qwe   XYYX
 Shan    231  asd   YXYX
 Yuva    453  qwe   YYXY
 Naan    314  ghj   YXYY
 Yuva    908  bnm   YYYx

现在我想知道函数/语句,它根据col3中的值发生的次数给出了col1和Col3的值对。即,当'qwe'发生一次(/两次/三次)时,col1中的对应值是多少。 预期的(必要的)答案是:

                  Upon giving   I should get
                 --------------------------- 
                    qwe =1      Naan
                    qwe =2      Yuva 
                    qwe=3       ------(not available). similarly
                    asd=1       Arun
                                Shan
                    ghj=1       Yuva
                                Naan
                    ghj = 2      -----(not available)
           and for  bnm=1       Yuva.

请帮帮我们。

2 个答案:

答案 0 :(得分:1)

xtabs函数返回一个支持矩阵索引的列联表:

getCombs <- function(nam , cnt) names( 
                   which(xtabs( ~Col1+Col3, data=dat)[ ,nam] == cnt)
                                    )

> getCombs("ghj", 1)
[1] "Naan" "Yuva"
> getCombs("ghj", 3)
character(0)

如果您需要将“not available”作为值,那么只需测试length()== 0的结果并返回该字符串(如果是)。

答案 1 :(得分:0)

也许是这样的:

x <- read.table(textConnection("Col1\tcol2\tCol3\tCol4\nYuva\t123\tqwe\tXXYY\nArun\t234\tasd\tXYXY\nYuva\t870\tghj\tXXYX\nNaan\t890\tqwe\tXYYX\nShan\t231\tasd\tYXYX\nYuva\t453\tqwe\tYYXY\nNaan\t314\tghj\tYXYY\nYuva\t908\tbnm\tYYYx\n"), header=TRUE, sep="\t", stringsAsFactors=FALSE)

selCol1 <- function(x, valCol3, occur) {
    s <- subset(x, Col3==valCol3)
    f <- as.factor(s$Col1)
    t <- table(f)
    idx <- which(t==occur)
    if(length(idx)==0)
        return(NA)
    else
        return(levels(f)[idx])
}

selCol1(x,"qwe",1)
selCol1(x,"qwe",2)
selCol1(x,"qwe",3)
selCol1(x,"ghj",1)
selCol1(x,"ghj",2)
selCol1(x,"bnm",1)