【问题标题】:How to create columns based on the order of other columns in data-frame in R?如何根据R中数据框中其他列的顺序创建列?
【发布时间】:2015-08-06 17:19:49
【问题描述】:

假设我们有以下df:

df

V1    V2   
1    .50
2    .30
3    .27
4    .59
5    .34
6    .23
7    .56
8    .78
9    .23

现在我想创建一个列 V3,使其对应于以前值的平均值。

简而言之,例如,V3[3]=.40 将是 (V2[1] + V2[2] / 2 ) = (.5 + .3)/2。

如何使用 dplyr 或纯 R 进行该操作?如何使用 data.frame 中的顺序来执行操作?

我在问一些变异函数。

我在纯 R 中尝试了这段代码,但它看起来效率不高:

df$V3 <- NA
for (i in 1:nrow(df)) {
  df$V3[i] <- mean(df$V2[1:(i-1)])
}

提前致谢。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    dplyr的解决方案:

     library(dplyr)
     df %>% mutate(V3 = lag(cummean(V2)))
    
      V1   V2        V3
    1  1 0.50        NA
    2  2 0.30 0.5000000
    3  3 0.27 0.4000000
    4  4 0.59 0.3566667
    5  5 0.34 0.4150000
    6  6 0.23 0.4000000
    7  7 0.56 0.3716667
    8  8 0.78 0.3985714
    9  9 0.23 0.4462500
    

    【讨论】:

    • 假设我只想要前两个元素的平均值?我该怎么做?
    • @GuilhermeDuarte 我一直在关注你的问题。下次如果你想要一个精确的东西,最好让每个人都以精确的方式问你的问题。无论如何,我认为它可以轻松完成。
    • 我问“如何使用 data.frame 中的顺序来执行操作?”但我需要精确。
    • @GuilhermeDuarte 确实标题似乎与真正的问题无关,在我看来,如何使用以前的n 元素创建一个新列。
    【解决方案2】:

    这行得通吗?:

    df$V3 <- cumsum(df$V2)/seq_along(df$V2)
    

    【讨论】:

    • @GuilhermeDuarte 我认为这不是一个很好的解决方案。以V3[3] 为例,它是0.3566667 而应该是0.4 等等。
    猜你喜欢
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2017-01-03
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多