【问题标题】:looping based on same values in one column and storing the results in a new dataframe [duplicate]基于一列中的相同值循环并将结果存储在新的数据框中[重复]
【发布时间】:2017-05-27 20:47:00
【问题描述】:

为了解释我的问题,我创建了以下 df:

hh_01 <- c(rep(1:4, each = 3), rep(5:10, each = 5))
vill <- c(rep(100, 12), rep(101, 30))
hh_02 <- c(2:4, 1, 3, 4, 1:2, 4, 1:3, 6:10, 5, 7:10, 5:6, 8:10, 5:7, 9:10, 5:8, 10, 5:9)
set.seed(1); dist <- abs(rnorm(42, mean = 0, sd = 1000))
df <- matrix(c(hh_01, vill, hh_02, dist), nrow = 42, ncol = 4)
colnames(df) <- c("hh_01", "vill", "hh_02", "dist")
df <- as.data.frame(df)
df
   hh_01 vill hh_02       dist
1      1  100     2 1728.39791
2      1  100     3  979.05280
3      1  100     4  972.09301
4      2  100     1  461.72457
5      2  100     3  384.84236
6      2  100     4  523.10665
7      3  100     1  482.88891
8      3  100     2  218.27501
9      3  100     4  878.32424
10     4  100     1   41.75679
11     4  100     2  967.72103
12     4  100     3  661.80881
13     5  101     6  851.74364
14     5  101     7  852.48595
15     5  101     8  471.51824
16     5  101     9  862.90742
17     5  101    10  750.57410
18     6  101     5 1714.03797
19     6  101     7   93.43975
20     6  101     8  640.15912
21     6  101     9  601.66437
22     6  101    10  969.44271
23     7  101     5   77.95871
24     7  101     6  604.71114
25     7  101     8  169.18386
26     7  101     9  435.42663
27     7  101    10  604.22278
28     8  101     5  475.18935
29     8  101     6   13.09895
30     8  101     7 2873.04565
31     8  101     9 1019.03810
32     8  101    10   41.51445
33     9  101     5  914.63453
34     9  101     6   67.62432
35     9  101     7   85.45653
36     9  101     8  971.21044
37     9  101    10 2074.87280
38    10  101     5   98.43913
39    10  101     6  437.63773
40    10  101     7  620.47573
41    10  101     8  376.56226
42    10  101     9 1013.93106

我的任务:对于所有具有相同值的 hh_01 计算 dist 的平均值并将结果保存在具有以下结构的新 df 中:

hh_01  vill  mean_dist
1      100   1226.515
2      100   .......

我知道我必须使用 for 循环(或者可能是 sapply/lapply 或 ),但我不知道如何完成此命令...

for (i in seq(along=df[,df$hh_01])){
  ifelse(df$hh_01[i] == df$hh_01[i+1])
}

我知道这些是编程的基础知识(不仅仅是在 R 中),但我不是程序员,而且在这方面还很新……) 我将不胜感激任何帮助。 代码越简单对我来说越好(请简短解释)。我想了解这种循环(或一般的循环),因为将来我必须经常处理这类问题。 非常感谢。

【问题讨论】:

  • 很好,您提供了示例数据,但它是基于随机生成的值,因此总是在变化,因此无法重现。使用 set.seed=1234 之类的东西来提供恒定的结果
  • 已更改。谢谢你的来信。

标签: r loops for-loop dplyr sapply


【解决方案1】:

你也可以使用aggregate:

dfnew<-aggregate(df[c("hh_01","vill","dist")],by=list(df$hh_01),mean)[-1]

【讨论】:

    【解决方案2】:

    dplyr 包在这里很有帮助。

    library(dplyr)
    
    new_df <- group_by(df, hh_01, vill)
    new_df <- summarize(new_df, mean_dist=mean(dist))
    

    示例输出:

       hh_01  vill mean_dist
       <dbl> <dbl>     <dbl>
    1      1   100  666.0538
    2      2   100  720.5532
    

    一个很棒的dplyr备忘单可以在这里找到:http://nbviewer.jupyter.org/github/rstudio/cheatsheets/blob/master/source/pdfs/data-transformation-cheatsheet.pdf

    summarize 是一个矢量化函数 - summarize 为您处理高效循环。

    【讨论】:

      【解决方案3】:

      这是一个使用dplyr 包的版本——尽管我从你那里得到了不同的结果。 R 的一个重要特征是许多函数都是vectorized,这松散地意味着它们可以对整个结构进行操作,而无需使用 for 或 apply 构造(for 或 apply 隐藏在函数中)。另请注意创建数据框的简化方法。

      set.seed = 123
      df <- data.frame(
        hh_01 = c(rep(1:4, each = 3), rep(5:10, each = 5)),
        vill = c(rep(100, 12), rep(101, 30)),
        hh_02 = c(2:4, 1, 3, 4, 1:2, 4, 1:3, 6:10, 5, 7:10, 5:6, 8:10, 5:7, 9:10, 5:8, 10, 5:9),
        dist = abs(rnorm(42, mean = 0, sd = 1000))
      )
      
      
      
      library(dplyr)
      df2 <- df %>%
        group_by(hh_01, vill) %>%
        summarize(mean_dist = mean(dist))
      df2
      
      #    hh_01  vill mean_dist
      #   < int> <dbl>     <dbl>
      # 1      1   100 1265.9534
      # 2      2   100  855.2477
      # 3      3   100  840.0750
      # 4      4   100  876.0722
      # 5      5   101  574.8193
      # 6      6   101  559.2385
      # 7      7   101 1177.1751
      # 8      8   101  765.6921
      # 9      9   101  438.8936
      # 10    10   101  331.3354
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-14
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 2015-03-17
        • 2019-11-08
        相关资源
        最近更新 更多