我有一个包含三列的数据集。
## 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列的行(可以是任何列)
仅选择仅列为1的行(可以是任何列)
基本上我想要任何两列(第二种情况)满足条件而不是任何特定列。
我知道使用
选择行subset<-data[c(data$x==1,data$y==1,data$z==1),]
但是这只根据特定列的条件选择那些行,而我希望三/两列中的任何一列都满足我的标准
由于
答案 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建议使用tabulate
和which
的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)