假设我有以下数据框,请将 0 读为 NA:
x = c("a","b","c","d","e")
y = c(1,1,0,0,1)
z = c(0,0,0,0,1)
data.frame(x,y,z)
如何计算每列的 1 数(即 a、b、c、d、e)?
如果只有 0/1,您可以简单地总结相关行。选择器[2:3]
选择从 2 到 3 的所有列。该向量可以根据您的需要进行调整。
第二部分添加来自 vector 的名称x
。
x = c("a","b","c","d","e")
y = c(1,1,0,0,1)
z = c(0,0,0,0,1)
df <- data.frame(x,y,z)
s <- rowSums(df[2:3])
names(s) <- x
s
# a b c d e
# 1 1 0 0 2
您会发现您的代码生成了一个按行而不是按列组织的 data.frame。
data <- data.frame(x,y,z)
data
x y z
1 a 1 0
2 b 1 0
3 c 0 0
4 d 0 0
5 e 1 1
您可能会发现考虑转置数据t()
:
t(data)
[,1] [,2] [,3] [,4] [,5]
x "a" "b" "c" "d" "e"
y "1" "1" "0" "0" "1"
z "0" "0" "0" "0" "1"
但是,现在我们有两个问题,首先,数据现在是一个矩阵。其次,数据现在是字符,因为数字数据和字符数据不能存在于 data.frame 的同一列中。
相反,我们可能只对数字列进行子集化并转置它们:
new.data <- as.data.frame(t(data[,-1]))
new.data
V1 V2 V3 V4 V5
y 1 1 0 0 1
z 0 0 0 0 1
现在我们可以添加回列名。
colnames(new.data) <- data[,1]
new.data
a b c d e
y 1 1 0 0 1
z 0 0 0 0 1
现在很容易colSums
:
result <- colSums(new.data)
result
a b c d e
1 1 0 0 2
如果我们需要将 NA 设为 0,我们可以子集化:
result[result == 0] <- NA
result
a b c d e
1 1 NA NA 2