如何添加一行,为另一列中的每个值对一列求和?

How to add a row which sums one column for every value in another column?

我有以下数据框:

 df <- structure(list(Number = c("3117", "3118", "3119", "3120", "3121", 
"3122"), City = c("Акмолинская", "Актюбинская", "Алматинская", 
"Атырауская", "ЗКО", "Жамбылская"), Year = c("2001", "2001", 
"2001", "2001", "2001", "2001"), Info = c("Среднегодовая численность населения РК (чел.)", 
"Среднегодовая численность населения РК (чел.)", "Среднегодовая численность населения РК (чел.)", 
"Среднегодовая численность населения РК (чел.)", "Среднегодовая численность населения РК (чел.)", 
"Среднегодовая численность населения РК (чел.)"), Value = c("765690", 
"669198", "1554447", "445631", "600987", "980563"), Status = c("Факт", 
"Факт", "Факт", "Факт", "Факт", "Факт")), row.names = c(NA, 6L
), class = "data.frame")

我需要对每年的值列求和,以便在城市列中创建一个带有“Республика Казахстан”的总和。换句话说,我需要为每年的所有城市创建一个价值总和,并在城市列中用国家名称命名。怎么做?

我试过这段代码,但它给了我“参数的 'type'(字符)无效”错误:

for (year in unique(df$Year)) {
  df[nrow(df) + 1,] = c("0","Республика Казахстан", year, "Среднегодовая численность населения РК (чел.)", sum(df[which(df[,3]==year),5]), "Факт")
}

(前面,我的 emacs/ess 没有显示 utf-8 字符串,所以它们在这里看起来是空的。它们不是。)

首先求和,不能是character。从那里总结然后加入原始数据。

基础 R

df$Value <- as.numeric(df$Value)
newdf <- transform(aggregate(Value ~ Year, data = df, FUN = sum), City = "City Sum")
newdf <- cbind(newdf, df[,setdiff(names(df), names(newdf))][0,][NA,])
rbind(df, newdf[,names(df)])
#   Number        City Year                                          Info   Value Status
# 1   3117             2001                                        (   .)  765690       
# 2   3118             2001                                        (   .)  669198       
# 3   3119             2001                                        (   .) 1554447       
# 4   3120             2001                                        (   .)  445631       
# 5   3121             2001                                        (   .)  600987       
# 6   3122             2001                                        (   .)  980563       
# 7   <NA>    City Sum 2001                                          <NA> 5016516   <NA>

dplyr

library(dplyr)
df <- mutate(df, Value = as.numeric(Value))
df %>%
  group_by(Year) %>%
  summarize(City = "City Sum", Value = sum(Value)) %>%
  bind_rows(df, .)
#   Number        City Year                                          Info   Value Status
# 1   3117             2001                                        (   .)  765690       
# 2   3118             2001                                        (   .)  669198       
# 3   3119             2001                                        (   .) 1554447       
# 4   3120             2001                                        (   .)  445631       
# 5   3121             2001                                        (   .)  600987       
# 6   3122             2001                                        (   .)  980563       
# 7   <NA>    City Sum 2001                                          <NA> 5016516   <NA>