尝试使用rowSums计算R中的类别变量

时间:2017-03-03 12:21:58

标签: r

我正在尝试计算每行的每个观察类别。

在下面数据的示例中,包含照片的顶行,2,3,4,5,6是标题,其下方的行包含观察结果。

我会使用countif在excel中进行,但是数据集很大,这只是一个很小的样本。加上螺丝excel:)

photo          2           3              4        5          6        
30001004501  SINV_SPO_V  SINV_HYD    LSUB_SAND   Unc     SINV_SPO_V        

我正在尝试这样做,以便为我计算​​的每个观察创建一个新列,即如果我试图确定“Unc”的频率将有自己的列“Unc”是多少次计算每一行。

以下代码是我在过去几天尝试过的事情之一,以及计数和长度命令的变化,但没有成功

data$Unc <-rowSums(data[,3:52] == "Unc", na.rm = F)

我试图让R只计算3到52之间的列

提前感谢任何帮助都会令人非常沮丧,因为我知道它应该非常简单

我希望这是有道理的

2 个答案:

答案 0 :(得分:1)

因此,如果我正确理解您的请求,这是您的问题的data.table解决方案,您可以在measure.vars中使用3:52来完成您的任务。此外,这仅适用于照片是唯一的id变量,如果不是,则应自行创建并使用该变量

library(data.table)
# create example data.table
dt <- data.table(photo = 1:6,
                 x1 = c("a", "b", "a", "c", "a", "d"),
                 x2 = c("c", "c", "a", "c", "a", "d"),
                 x3 = c("c", "c", "a", "c", "a", "d"))

# Melt data.table, select which columns you need
dt_melt <- melt.data.table(dt, id.vars = 'photo', measure.vars = 2:3, variable.name = 'column')
# Get a resulting data.table with pairs of photo and observation
result_dt <- dt_melt[, .N, by = c('photo', 'value')]

   photo value N
1:     1     a 1
2:     2     b 1
3:     3     a 2
4:     4     c 2
5:     5     a 2
6:     6     d 2
7:     1     c 1
8:     2     c 1

# For wide representation
dcast(result_dt, photo ~ value, value.var = 'N', fill = 0)

   photo a b c d
1:     1 1 0 1 0
2:     2 0 1 1 0
3:     3 2 0 0 0
4:     4 0 0 2 0
5:     5 2 0 0 0
6:     6 0 0 0 2

答案 1 :(得分:0)

我认为解决问题的方法是使用table函数:

col1 <- c('a','b','b','b','a','c','b','a','c')
col2 <- c('d','e','d','d','d','d','d','d','e')
data = data.frame(col1,col2)
table(col1)
table(col2)
tab = table(data)
tab
margin.table(tab,1)
margin.table(tab,2)

table(col1)会为您提供col1的分类变量的频率,这会得到与margin.table(tab,1)相同的结果。因此,这取决于您是希望直接处理data.frame还是列。