在循环中创建多个子集

时间:2017-04-06 13:56:08

标签: r

使用R,我试图找到第1和第2列中包含多少相同的元素,第1和第3,第1和第4等...作为输出我希望有一个数据框,其中表示原始数据集中有多少行符合条件。

我唯一的想法是使用subset函数,当列被定义为data$a时,该函数可以正常工作。但是当我意识到我不能在循环中使用子集函数时我真的不知道我还能用什么。

非常感谢任何帮助。

D <- 0

a <-floor(runif(10, 1,101)) 
b <-floor(runif(10, 1,101))
c <-floor(runif(10, 1,101))
d <-floor(runif(10, 1,101))

data <- cbind(a,b,c,d) #Generate random data

for(i in 2:ncol(data)){
sub<- nrow(subset(data, a == 10 & data[,i] == 10)) #Compare a with all other columns and return the number of rows
D[,paste0("col_",i)] <- sub #output
}

1 个答案:

答案 0 :(得分:0)

通常你可以colSums(data[data[,1]==10, -1, drop=FALSE]==10)

set.seed(42)
n <- 500
x <- 5:20
data <- data.frame(a=sample(x, n, rep=TRUE), b=sample(x, n, rep=TRUE), c=sample(x, n, rep=TRUE), d=sample(x, n, rep=TRUE))
data[data[,1]==10, -1, drop=FALSE] # or data[data$a==10, ...]
colSums(data[data[,1]==10, -1, drop=FALSE]==10) # or data[data$a==10, ...]

但如果10中没有值a,则会遇到问题,例如:

set.seed(42)
n <- 500
x <- 5:20
data <- data.frame(a=10L+sample(x, n, rep=TRUE), b=sample(x, n, rep=TRUE), c=sample(x, n, rep=TRUE), d=sample(x, n, rep=TRUE))
data[data[,1]==10, -1, drop=FALSE] # or data[data$a==10, ...]
colSums(data[data[,1]==10, -1, drop=FALSE]==10) # or data[data$a==10, ...]

您必须首先通过

测试这种情况
any(data$a==10)

以下是使用回收规则的解决方案:

data <- as.matrix(data)
colSums(data[,1]==10 & data[, -1]==10)

此解决方案没有上述问题。

以下是data.table的解决方案:

library("data.table")

set.seed(42)
n <- 500
x <- 5:20
data <- data.table(a=sample(x, n, rep=TRUE), b=sample(x, n, rep=TRUE), c=sample(x, n, rep=TRUE), d=sample(x, n, rep=TRUE))
data[a==10, sapply(.SD, function(x) sum(x==10)), .SDcols=-1]
set.seed(42)
data <- data.table(a=10L+sample(x, n, rep=TRUE), b=sample(x, n, rep=TRUE), c=sample(x, n, rep=TRUE), d=sample(x, n, rep=TRUE))
data[a==10, sapply(.SD, function(x) sum(x==10)), .SDcols=-1]