【问题标题】:R: loop through unique values of column and compute new variablesR:遍历列的唯一值并计算新变量
【发布时间】:2018-10-20 20:35:30
【问题描述】:

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

这是一个例子:

数据:

fpd_2b.csv

数据框中有 40 行。 20行的SID值为“9003”,20行的值为“1028”。

我想创建一个名为“numPR”的变量和列,它是 df(“PreviewRound”)中已经存在的列的值的总和。 “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 和其他网站上查看了类似的帖子,但我的问题没有运气。我确信解决方案非常简单,非常感谢您的帮助,伙计们!

【问题讨论】:

    标签: r loops unique


    【解决方案1】:

    如果我们想创建一个列,使用'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”列,只留下last 中的一个sum 更新unique“SID”。为了避免这种情况,请使用索引

    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
    }
    

    【讨论】:

    • 非常感谢@akrun。我已经将我想要创建的其他变量/列放在同一个循环中,它的工作原理就像一个魅力。非常感谢您教我为什么它不能正常工作,而不仅仅是提供代码。
    • 谢谢,@akrun。我实际上还有另一个非常相关的问题。我认为它足以保证不同的帖子,但也想以你的方式拍摄它:stackoverflow.com/questions/52951304/…
    猜你喜欢
    • 1970-01-01
    • 2023-01-16
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    相关资源
    最近更新 更多