在for循环中使用dplyr select和mutate函数向数据帧添加新变量

在for循环中使用dplyr select和mutate函数向数据帧添加新变量,r,for-loop,dplyr,R,For Loop,Dplyr,请让我知道这是否是重复的。我查看了一下堆栈,发现了一些类似的问题,但并没有完全回答我的问题。我是初学者,所以我感谢任何人的帮助 我试图将年度汇总变量添加到月度数据的数据框架中,即跨行求和。下面是一个每月数据有限的数据框示例 df <- data.frame("Jan.2012" = c(1, 4, 5, 6), "Feb.2012" = c(3, 5, 7, 9), "Jan.2013" = c(6, 8, 9, 10), "Feb.2013" = c(7, 5, 11, 13), "J

请让我知道这是否是重复的。我查看了一下堆栈,发现了一些类似的问题,但并没有完全回答我的问题。我是初学者,所以我感谢任何人的帮助

我试图将年度汇总变量添加到月度数据的数据框架中,即跨行求和。下面是一个每月数据有限的数据框示例

df <- data.frame("Jan.2012" = c(1, 4, 5, 6), "Feb.2012" = c(3, 5, 7, 9),
 "Jan.2013" = c(6, 8, 9, 10), "Feb.2013" = c(7, 5, 11, 13), "Jan.2014" = c(6, 8, 9, 11), 
 "Feb.2014" = c(7, 3, 5, 9))
新变量将命名为TotalYr2012、TotalYr2013等。例如,TotalYr2012=c4、9、12、15等

我试图迭代for循环,但这不是生成这些变量的最佳实践。我知道我在assign语句中做了一些错误的事情,并且我得到了一个错误

for (i in 2012:2014) {
  varname <- paste("TotalYr", i, sep = "")
    assign(df$varname, df %>% select(contains("i")) %>% 
     mutate(varname = sum()))
}
谢谢你的帮助

通过使用tidyr::gather和zoo::yearmon函数来计算每年的汇总,可以避免for循环

library(tidyverse)
library(zoo)

df %>% gather(Date, value) %>%
  mutate(Date = as.yearmon(Date,"%b.%Y")) %>%
  group_by(Year = year(Date)) %>%
  summarise(Total = sum(value)) %>%
  spread(Year, Total)

# # A tibble: 1 x 3
#     `2012` `2013` `2014`
# *   <dbl>  <dbl>  <dbl>
# 1   40.0   69.0   58.0  
通过使用tidyr::gather和zoo::yearmon函数来计算每年的汇总,可以避免for循环

library(tidyverse)
library(zoo)

df %>% gather(Date, value) %>%
  mutate(Date = as.yearmon(Date,"%b.%Y")) %>%
  group_by(Year = year(Date)) %>%
  summarise(Total = sum(value)) %>%
  spread(Year, Total)

# # A tibble: 1 x 3
#     `2012` `2013` `2014`
# *   <dbl>  <dbl>  <dbl>
# 1   40.0   69.0   58.0  

你有很多问题

$不适用于变量。使用[或[[相反..另外,您的缩进很混乱,让我们保持一致:

for (i in 2012:2014) {
  varname <- paste("TotalYr", i, sep = "")
  assign(df[[varname]], df %>% select(contains("i")) %>% 
    mutate(varname = sum()))
}
i是一个字符串,它的值始终是字母i,就像2的值始终是2一样。即使在包含中,您也希望使用分配给对象i的值,尽管该值确实需要是字符串,也就是说,它需要是类字符:

在控制台中键入sum-得到0。您需要提供一些要求和的内容。让我们完全放弃mutate,只需求和拉向量,这样我们就不必担心它的名称:

for (i in 2012:2014) {
  varname <- paste("TotalYr", i, sep = "")
  df[[varname]] <- df %>% select(contains(as.character(i))) %>% 
    pull %>% sum
}
现在它工作了,并给出了一个有效的解决方案。但是,它仍然很混乱。因为循环通常是不必要的。我们有更好的工具来整理数据

# See MKR's answer. It's the way you should actually do this.

你有很多问题

$不适用于变量。请使用[或[]代替..此外,缩进比较混乱,让我们使其保持一致:

for (i in 2012:2014) {
  varname <- paste("TotalYr", i, sep = "")
  assign(df[[varname]], df %>% select(contains("i")) %>% 
    mutate(varname = sum()))
}
i是一个字符串,它的值始终是字母i,就像2的值始终是2一样。即使在包含中,您也希望使用分配给对象i的值,尽管该值确实需要是字符串,也就是说,它需要是类字符:

在控制台中键入sum-得到0。您需要提供一些要求和的内容。让我们完全放弃mutate,只需求和拉向量,这样我们就不必担心它的名称:

for (i in 2012:2014) {
  varname <- paste("TotalYr", i, sep = "")
  df[[varname]] <- df %>% select(contains(as.character(i))) %>% 
    pull %>% sum
}
现在它工作了,并给出了一个有效的解决方案。但是,它仍然很混乱。因为循环通常是不必要的。我们有更好的工具来整理数据

# See MKR's answer. It's the way you should actually do this.

$不适用于变量,您需要使用[或[]。但您还有其他几个问题。$不适用于变量,您需要使用[或][[.但是你还有其他几个问题。精彩的解释,几乎涵盖了所有方面。也许你的答案对初学者的帮助比我的要大。我的答案涵盖了OP方法的错误,你的答案涵盖了正确的方法。我认为它们互补得很好。多亏了你们两位。我学到了很多基本原则未来的项目只需阅读您共享的原则。然而,当我在RStudio中运行此代码时,结果返回一个0行0列的数据帧。如果我遗漏了什么,请告诉我。我忘记了将最后一个df更改为6。现在已修复。精彩的解释,几乎涵盖了所有内容。可能您的答案非常有用我的答案涵盖了OP方法的错误之处,你的答案涵盖了正确的方法。我认为它们互补性很好。感谢你们。我从阅读你们分享的原则中学到了很多未来项目的一般原则。然而,当我在RStudio中运行此代码时,结果返回一个数据帧第0行和第0列。如果我遗漏了什么,请告诉我。我忘了更改最后一个df以生成6。现在已修复。我对此表示感谢。我一定没有清楚地解释我自己。我想对df的行进行求和,因为每个记录代表2012年1月的产品X销售、2013年2月的产品Y销售等。所以我希望看到一个2012年几个月X产品销售的ll等。但是,看到这些代码确实帮助我理解了dplyr方法,以获得我想要的答案,因此,谢谢!我对此表示感谢。我一定没有清楚地解释自己。我想对df行进行汇总,因为每个记录都代表2012年1月X产品销售、201年2月Y产品销售3等。因此,我希望看到2012年几个月X产品的所有销售情况,等等。但是,看到这些代码确实帮助我理解了dplyr方法,以获得我想要的答案,因此,谢谢!