我试图通过引用一列(SID)中的唯一值来遍历数据集。我想基于数据框中的现有列创建几个变量。这些将针对SID的每个唯一值进行计算。目前,我的代码并未根据SID的唯一值进行分离。它是对整个数据集的值求和。
这里是一个示例:
数据:
数据框中有40行。 SID中的20行的值为“ 9003”,而20行的值为“ 1028”。
我想创建一个变量和名为“ numPR”的列,这是df中已存在的列(“ PreviewRound”)的值的总和。 “ PreviewRound”中的值为0或1s。
在此特定示例中,对于SID的每个唯一值,numPR应该为6,但是目前为12(未按SID分隔)。
代码如下:
file = "fpd_2b.csv"
headers = read.csv(file, header = F, nrows = 1, as.is = T)
df = read.csv(file, skip = 2, header = F)
colnames(df) = headers
# Remove blank rows (there is a blank row between each unique SID)
df = subset(df, SID >1)
df$SID = factor(df$SID)
for (sid in unique(df$SID)) {
numPR = sum(df$PreviewRound)
df$numPR = numPR
}
numPR的整个列都用12填充,但是应该用6填充(9003为6,1028为6)。任何帮助将非常感激!我已经检查了Stack Overflow和其他网站上的类似帖子,但是还没有碰到我的问题。我相信解决方案非常简单,非常感谢大家的帮助!
答案 0 :(得分:0)
如果要创建列,请使用“ SID”作为分组变量
df$numPR <- with(df, ave(PreviewRound, SID, FUN = sum))
或者,如果我们想要汇总的输出,请使用aggregate
aggregate(PreviewRound~ SID, df, FUN = sum)
OP代码的问题在于如何替换值
df$numPR = numPR
在OP的for
循环中,更重要的是
numPR = sum(df$PreviewRound)
占用了整个“ PreviewRound”列的sum
每次for
循环运行时,都会更新'numPR'列,仅留下sum
更新的last
'SID'中的单个unique
。为了避免这种情况,请使用索引
df$numPR <- NA
for (sid in unique(df$SID)) {
i <- df$SID == sid # create a logical index
numPR = sum(df$PreviewRound[i]) # subet the data based on the index
df$numPR[i] = numPR # assign the values only to those selected rows
}