0

假设我有以下数据框,请将 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)?

4

2 回答 2

1

如果只有 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 
于 2021-01-08T18:00:29.690 回答
1

您会发现您的代码生成了一个按行而不是按列组织的 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 
于 2021-01-08T18:01:35.950 回答