R:遍历列的唯一值并计算新变量



我正在尝试通过引用一列中的唯一值(SID(来循环访问数据集。我想根据数据框中的现有列创建几个变量。将针对 SID 的每个唯一值计算这些值。目前,我的代码没有根据 SID 的唯一值进行分离。它对整个数据集的值求和。

下面是一个示例:

数据:

fpd_2b.csv

数据帧中有 40 行。20 行在 SID 中的值为"9003",20 行的值为"1028"。

我想创建一个名为"numPR"的变量和列,它是 df 中已经存在的列值的总和("预览轮"(。"PreviewRound"中的值为 0 或 1。

在此特定示例中,对于 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(6 表示 9003,6 表示 1028(。任何帮助将不胜感激!我已经在Stack Overflow和其他网站上查看了类似的帖子,但对我的问题没有运气。我相信解决方案非常简单,非常感谢您的帮助,伙计们!

如果我们想创建一个列,请使用"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) 

正在sum整个"预览回合"列

每次运行for循环时,"numPR"列都会更新,只留下更新unique"SID"last的单个sum。 为了避免这种情况,请使用索引

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
}

最新更新