R选择数据子集

时间:2016-05-03 18:30:38

标签: r subset

我有一个包含三列的数据集。

## generate sample data
set.seed(1)
x<-sample(1:3,50,replace = T )
y<-sample(1:3,50,replace = T )
z<-sample(1:3,50,replace = T )
data<-as.data.frame(cbind(x,y,z))

我想做的是:

  1. 选择所有三列都有1

  2. 的行
  3. 选择只有两列有1列的行(可以是任何列)

  4. 仅选择仅列为1的行(可以是任何列)

  5. 基本上我想要任何两列(第二种情况)满足条件而不是任何特定列。

    我知道使用

    选择行
    subset<-data[c(data$x==1,data$y==1,data$z==1),]
    

    但是这只根据特定列的条件选择那些行,而我希望三/两列中的任何一列都满足我的标准

    由于

2 个答案:

答案 0 :(得分:5)

n = 1 # or 2 or 3
data[rowSums(data == 1) == n,]

答案 1 :(得分:3)

这是另一种方法:

rowCounts <- table(c(which(data$x==1), which(data$y==1), which(data$z==1)))

# this is the long way
df.oneOne <- data[as.integer(names(rowCounts)[rowCounts == 1]),]
df.oneTwo <- data[as.integer(names(rowCounts)[rowCounts == 2]),]
df.oneThree <- data[as.integer(names(rowCounts)[rowCounts == 3]),]

最好在列表中保存多个data.frames,尤其是当存在一些引导此存储的结构时,就像这里的情况一样。按照@ richard-scriven的建议,您可以使用lapply

轻松完成此操作
df.oneCountList <- lapply(1:3, function(i)
                          data[as.integer(names(rowCounts)[rowCounts == i]),]
names(df.oneCountList) <- c("df.oneOne", "df.oneTwo", df.oneThree)

然后,您可以使用索引df.oneCountList[[1]]或其名称df.oneCountList[["df.oneOne"]]来提取data.frames。

下面的@eddi建议使用tabulatewhich的arr.ind参数提取表名的方法的一个很好的快捷方式。当应用于多维对象(如数组或data.frame)时,设置arr.ind == TRUE会生成行的索引和逻辑表达式求值为TRUE的列。他的建议利用这个来拉出行向量,其中在所有变量中找到1。然后将tabulate函数应用于这些行值,并且制表符返回一个排序向量,其中每个元素表示一行,而不带1的行用0填充。

在这种方法下,

 rowCounts <- tabulate(which(data == 1, arr.ind = TRUE)[,1])

返回一个向量,您可以从中立即提取值。您可以包含以上lapply以获取data.frames列表:

df.oneCountList <- lapply(1:3, function(i) data[rowCounts == i,])
names(df.oneCountList) <- c("df.oneOne", "df.oneTwo", df.oneThree)