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

时间:2018-10-20 20:35:31

标签: r loops unique

我试图通过引用一列(SID)中的唯一值来遍历数据集。我想基于数据框中的现有列创建几个变量。这些将针对SID的每个唯一值进行计算。目前,我的代码并未根据SID的唯一值进行分离。它是对整个数据集的值求和。

这里是一个示例:

数据:

fpd_2b.csv

数据框中有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和其他网站上的类似帖子,但是还没有碰到我的问题。我相信解决方案非常简单,非常感谢大家的帮助!

1 个答案:

答案 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
}