【问题标题】:calculate the mean of different subsets based on the same ID in a dataframe and store the results in a new dataframe in R根据数据帧中的相同 ID 计算不同子集的平均值,并将结果存储在 R 中的新数据帧中
【发布时间】:2017-10-20 17:45:36
【问题描述】:

我的数据框 (hh_dist_points) 具有以下结构:

hh_dist_points <- read.table(header=TRUE ,text="
  hhid VillageID hhid_1 VillageI_1    NEAR_DIST
  2739 405050508   2730  405050508 8.300739e+01
  2739 405050508   2588  405050508 9.717326e+01
  2739 405050508   2825  405050508 1.335821e+02
  2739 405050508   2823  405050508 1.631118e+02
  2739 405050508   2729  405050508 1.964680e+02
  2739 405050508   2810  405050508 2.243312e+02
  2739 405050508   2828  405050508 2.889768e+02
  2739 405050508   2725  405050502 8.808605e+02
  2739 405050508   2822  405050502 9.084585e+02
  2739 405050508   2731  405050502 9.222313e+02
  2739 405050508   2742  405050502 9.681594e+02
  2739 405050508   2741  405050502 1.026474e+03")

原始数据集包含约。 2000 个观察值(1 个观察值 = 一个村庄中的房屋 (hhid)。属于同一村庄的房屋具有相同的 VillageID(约 10 个具有相同 ID 的观察值)。 Near_Dist:2 个房屋之间的测地距离(hhid) 上面的数据框显示了我的数据集 (hhid_1) 中每个房子 (hhid) 到所有其他房子的距离(总共超过 3 个 Mio. 行)。

我的目标: 根据相同的 VillageID 计算每组观测值 (hhid) 的 Near_Dist 的平均值,并将结果存储在新的数据框中:

VillageID   dist_mean
405050508   963,257416
405050502   823,21464
.....       .........

总体思路:如果 VillageID = VillageID_1,则计算 Near_Dist 的平均值并将结果存储在新的数据框中。

我的想法是使用循环:

if(hh_dist_points$VillageID = hh_dist_points$VillageI_1) {
hh_dist_new <- mean(hh_dist$NEAR_DIST)
}
else 

但我知道这是不正确的(并且未完成),但我不知道如何完成它。 任何想法如何简单地解决这个问题? (也许不使用循环)。 我试图搜索任何答案和解决方案,但我没有找到任何答案。

我需要数据框进行其他计算。 非常感谢四你的帮助。

【问题讨论】:

  • 你的 'hh_dist_points$VillageID = hh_dist_points$VillageI_1' 需要是 '==' :)

标签: r loops if-statement dataframe mean


【解决方案1】:

你可以试试这样的:

 require(dplyr)

 new_data  <- hh_dist_points %>%
  filter_("VillageID == VillageI_1") %>%
  group_by(VillageID) %>%
  summarise(dist_mean=mean(NEAR_DIST, na.rm = TRUE))

【讨论】:

    【解决方案2】:

    虽然你可以在 R 基础中做到这一点,但使用 data.table 很容易做到

    library(data.table)
    
    
    hh_dist_points <- read.table(header=TRUE ,text="
          hhid VillageID hhid_1 VillageI_1    NEAR_DIST
          2739 405050508   2730  405050508 8.300739e+01
          2739 405050508   2588  405050508 9.717326e+01
          2739 405050508   2825  405050508 1.335821e+02
          2739 405050508   2823  405050508 1.631118e+02
          2739 405050508   2729  405050508 1.964680e+02
          2739 405050508   2810  405050508 2.243312e+02
          2739 405050508   2828  405050508 2.889768e+02
          2739 405050508   2725  405050502 8.808605e+02
          2739 405050508   2822  405050502 9.084585e+02
          2739 405050508   2731  405050502 9.222313e+02
          2739 405050508   2742  405050502 9.681594e+02
          2739 405050508   2741  405050502 1.026474e+03")
    
    
    dt <- data.table(hh_dist_points)
    dt[VillageID==VillageI_1,mean(NEAR_DIST,na.rm=TRUE),.(VillageID)]
    
    #  VillageID       V1
    # 1: 405050508 169.5215
    

    【讨论】:

    • 这只是 VillageID。当我运行代码时,我收到错误:“错误:意外',' in "dt[,mean(NEAR_DIST,na.rm=TRUE)],
    • 对不起,我之前没有测试过代码。我更正了。
    • 我刚刚使用生成的数据框的结果编辑了您的答案。结果是错误的。 (我需要 obs 的意思,其中 VillageID = VillageI_1)。
    【解决方案3】:

    如果我理解正确,这将起作用:

    require(dplyr)
    newDF<- hh_dist_points%>%
        group_by(VillageID, Village_I1)%>%
        summarize(average=mean(NEAR_DIST)) 
    

    这将创建一个名为 newDF 的新数据框,其中包含您的 VillageID 和 VIllageI1 列,然后添加一个名为 average 的列,其中包含 NEAR_DIST 中每个 village_ID 和 Village_I1 组合的值的平均值。

    那么你可以使用:

    finalDF<- newDF[newDF$Village_ID == newDF$Village_I1,]
    

    这将仅保留两列 ID 相等的行。它。这使您远离循环,并且非常快速且易于理解逻辑。

    如果我误解了你,而这不是你想要的,请给我留言解释如何,我会完善答案。

    【讨论】:

    • 运行您的代码后,我收到以下警告消息:警告消息:1:未知或未初始化的列:'Village_ID'。 2:未知或未初始化的列:“Village_I1”。
    • 尝试剪切并粘贴数据框的名称以及代码中的两列,以防我拼写错误或某处添加了空格。如果这不起作用,请运行 str(hh_dist_points) 并将结果放在 EDIT: 中,然后在此处发表评论,我会尝试看看可能出了什么问题。
    • 您只是通过总结summarize(average=mean(NEAR_DIST)) 忘记了一个括号,但它运行良好。我制作了一些不同 VillageID 的子集来控制距离,但似乎一切都正确......非常感谢!
    • sorry...我在自己的数据上测试并剪切粘贴,一定是剪切太多了!我会为下一个人修好它!
    猜你喜欢
    • 2020-04-07
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2018-01-05
    • 2020-06-21
    • 2018-08-18
    • 1970-01-01
    相关资源
    最近更新 更多