我正在尝试计算每行的每个观察类别。
在下面数据的示例中,包含照片的顶行,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之间的列
提前感谢任何帮助都会令人非常沮丧,因为我知道它应该非常简单
我希望这是有道理的
答案 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还是列。