2017-04-06 39 views
1

使用R,我試圖找出有多少相同的元素包含在第一和第二列,第一和第三,第一和第四等...作爲輸出我想有一個數據框,其中說明原始數據集中有多少行滿足條件。在一個循環中創建多個子集

我唯一的想法是使用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 
} 
+0

對於你的隨機數據,也可以使用一襯墊'數據< - 矩陣(樣品(100L,40%,取代= TRUE) - 1L ,10)'。你也應該使用'set.seed'來使結果重現。另外,請注意,數據是一個矩陣,所以'數據$​​'將不起作用。 – lmo

+0

謝謝你的回答。我實際使用的數據不是隨機的。我爲這個問題使用了隨機數據,因爲我更容易創建像這樣的可重複的示例。 – Jane

+0

http://stackoverflow.com/help/someone-answers – jogo

回答

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, ...] 

,但你會出現問題,如果沒有價值10a,如:

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] 
+0

回收規則的解決方案對我來說非常合適。謝謝! – Jane