【问题标题】:Summing data by unique rows按唯一行汇总数据
【发布时间】:2022-01-24 05:49:53
【问题描述】:

我对 R 很陌生,我需要一些数据方面的帮助。我希望程序进入“prim_county”列中的每个唯一值,在标题为“acc_water”的列中添加与该唯一值 prim_county 关联的值,然后将其粘贴到一个名为“total_water_acc”的新变量中。我认为下面我的 r 代码中加粗的 for 循环可以做到这一点,但它不起作用。它总结了“acc_water”中的整个列。我将链接附加到我的数据和我的 r 代码。任何帮助将不胜感激!

链接数据:https://mstate-my.sharepoint.com/:x:/g/personal/md1891_msstate_edu/EXD8Gp_Bh5tDrZjhQu_LjVUBiHC1VmZPQzO9OhcAA8SrBQ?email=md1891%40msstate.edu&e=MHutJ2

R-代码

####2014 Data#############
attach(X2014_Data)
data2014 <- X2014_Data
View(data2014)
##interpolating###
data2014$water_3740 <- data2014$water_3000 + (3740 - 3000)*((data2014$water_4000 - data2014$water_3000)/(4000 - 3000))
data2014$sewer_3740 <- data2014$sewer_3000 + (3740 - 3000)*((data2014$sewer_4000 - data2014$sewer_3000)/(4000 - 3000))
data2014$water_7480 <- data2014$water_7000 + (7480 - 7000)*((data2014$water_10000 - data2014$water_7000)/(10000 - 7000))
data2014$sewer_7480 <- data2014$sewer_7000 + (7480 - 7000)*((data2014$sewer_10000 - data2014$sewer_7000)/(10000 - 7000))

data2014$water_Rate5c <- data2014$water_3740 + (5610 - 3740)*((data2014$water_7480 - data2014$water_3740)/(7480 - 3740))
data2014$sewer_Rate5c <- data2014$sewer_3740 + (5610 - 3740)*((data2014$sewer_7480 - data2014$sewer_3740)/(7480 - 3740))
data2014$water_12500 <- data2014$water_10000 + (12500 - 10000)*((data2014$water_15000 - data2014$water_10000)/(15000 - 10000))
data2014$sewer_12500 <- data2014$sewer_10000 + (12500 - 10000)*((data2014$sewer_15000 - data2014$sewer_10000)/(15000 - 10000))

##Weighting#
data2014$total_water_acc <- NA
data2014$total_sewer_acc <- NA
data2014$county <- NULL
data2014$weight <- NA
data2014$acc_water <- NA
data2014$acc_sewer <- NA

for (i in 1:485) {
  ifelse(data2014$serv_type[i] != "S",data2014$acc_water[i] <- data2014$serv_acc[i], data2014$acc_water[i] <- NA)
}

for (i in 1:485){
  ifelse(data2014$serv_type[i] !="W", data2014$acc_sewer[i] <- data2014$serv_acc[i], data2014$acc_sewer[i] <- NA)
}

**for (i in unique(data2014$prim_county)){
  data2014$total_water_acc <- sum(data2014$acc_water[unique(data2014$prim_county) == i], na.rm = TRUE)
}**

##########数据######

【问题讨论】:

  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: r loops for-loop unique


【解决方案1】:

所以我无法使用您发送的链接来访问数据,所以我制作了一个可重现的小示例,希望能近似您的问题。有几种方法可以做到这一点,但您可以通过 Tidyverse 库或基本 R 来做到这一点。我已经为这两种方法提供了选项。

data = data.frame(prim_county = c(rep(1:10, 10)), 
                  acc_water = c(rnorm(100, mean = 60, sd = 4)))

# to group by a variable, make it a factor first - YOU NEED TO DO THIS FOR BOTH OPTIONS
data$prim_county = as.factor(data$prim_county)

##### a tidyverse way #####
library(tidyverse) # load tidyverse 
summarized_data = data %>% # make new summarized dataframe 
  group_by(prim_county) %>% # use this to go over each unique value in prim_country
  summarize(total_water_acc = sum(acc_water)) # sum the values of interest

##### a base R way #####

# start by making a dataframe the size you need 
summarized_data = data.frame(prim_county = unique(data$prim_county)) 
summarized_data$total_water_acc = NA #fill column with NA's for now 

# use for loop to go through 
j = 1 # j to index new dataframe 
for(i in unique(data$prim_county)) { # loop through unique values 
  summarized_data$total_water_acc[j] = sum(data[which(data$prim_county == i), "acc_water"]) # get the position in the new dataframe by the sum of the data which matches the i we want 
  j = j + 1 # advance j 
}

此外,这没什么大不了的,但如果您提供一个最小可重现示例(又名 reprex),通常最容易帮助您,下次查看此有用链接 :) https://stackoverflow.com/help/minimal-reproducible-example

【讨论】:

  • 哇!这就像一个魅力!对于链接不起作用,我深表歉意,下次我一定会提供一个最低限度的可重现示例!这是我的第一篇堆栈文章,感谢您的帮助!
  • 没问题!如果它解决了您的问题,您可以将其标记为已接受的答案吗? :)
猜你喜欢
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多