通常情況下,你可以做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]
對於你的隨機數據,也可以使用一襯墊'數據< - 矩陣(樣品(100L,40%,取代= TRUE) - 1L ,10)'。你也應該使用'set.seed'來使結果重現。另外,請注意,數據是一個矩陣,所以'數據$'將不起作用。 – lmo
謝謝你的回答。我實際使用的數據不是隨機的。我爲這個問題使用了隨機數據,因爲我更容易創建像這樣的可重複的示例。 – Jane
http://stackoverflow.com/help/someone-answers – jogo