具有程序名称的列重复

时间:2019-08-02 08:53:25

标签: r dictionary dplyr purrr

我有需要分成几个月的年度数据。操作非常容易,因为我只需要将几个月中的年度数据平均分配即可。

我的第一步是将年度列复制12次,并使用适当的列名称(月)。下一步是将每一列除以12。

我被困在第一步,因为我能够创建月份列,但是只填充了第一列,其余的只是不适用

请参见下面的鸢尾花数据集的一些代码

months <- paste(2019,seq(1,12,1), sep = "-")
map_df(months, ~
             iris %>% mutate(!!.x := Sepal.Length))
   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species 2019-1 2019-2 2019-3 2019-4 2019-5 2019-6 2019-7 2019-8 2019-9 2019-10 2019-11 2019-12
1           5.1         3.5          1.4         0.2     setosa    5.1     NA     NA     NA     NA     NA     NA     NA     NA      NA      NA      NA
2           4.9         3.0          1.4         0.2     setosa    4.9     NA     NA     NA     NA     NA     NA     NA     NA      NA      NA      NA
3           4.7         3.2          1.3         0.2     setosa    4.7     NA     NA     NA     NA     NA     NA     NA     NA      NA      NA      NA
4           4.6         3.1          1.5         0.2     setosa    4.6     NA     NA     NA     NA     NA     NA     NA     NA      NA      NA      NA

如您所见,对于2019-1来说效果很好(复制Sepal.Length),但其余月份仅为NA。

我在这里想念什么?

3 个答案:

答案 0 :(得分:2)

当您可以直接将值分配给多个列时,您真的需要此方法吗?

df <- iris 
df[months] <- df$Sepal.Length

df[5:8]

#       Species 2019-1 2019-2 2019-3
#1       setosa    5.1    5.1    5.1
#2       setosa    4.9    4.9    4.9
#3       setosa    4.7    4.7    4.7
#4       setosa    4.6    4.6    4.6
#5       setosa    5.0    5.0    5.0
#6       setosa    5.4    5.4    5.4
#... 

答案 1 :(得分:1)

如果使用for循环来做到这一点应该不是什么大问题。在这里,我提供了一个使用{data.table}的示例。

library(data.table)
iris <- data.table(iris)

months <- paste(2019, seq(1,12,1), sep = "-")

for(i in 1:12){

  iris[, (months[i]) := Sepal.Length]

}

由于我对{dplyr}不太熟悉,因此我可以给出类似的等效词,但是有更好的方法可以实现。

for(i in 1:12){

  iris <- mutate(iris, PlaceHolder = Sepal.Length)
  names(iris) <- gsub("PlaceHolder", months[i], names(iris))

}

答案 2 :(得分:0)

它们不为空。问题是,您在~右侧的表达式返回的不是列,而是 tibble 。检查结果中有多少行:

map_df(months, ~ iris %>% mutate(!!.x := Sepal.Length)) %>% nrow

结果是1800!这是因为map_df实际上是map_dfr的变相,并且它试图绑定结果数据帧的行。因此,第一列将是Sepal.Width,然后是一堆NA。下一列–一堆NA,然后是一堆值,然后又是一堆NA ...让我们从虹膜中取出三个日期和三行:

months <- paste(2019,seq(1,3,1), sep = "-")
map_df(months, ~ iris %>% slice(1:3) %>% mutate(!!.x := Sepal.Length) %>% select(!!.x))

结果是

  2019-1 2019-2 2019-3
1    5.1     NA     NA
2    4.9     NA     NA
3    4.7     NA     NA
4     NA    5.1     NA
5     NA    4.9     NA
6     NA    4.7     NA
7     NA     NA    5.1
8     NA     NA    4.9
9     NA     NA    4.7

要获得所需的内容,您需要使用map_dfc(按列绑定):

map_df(months, ~ iris %>% slice(1:3) %>% mutate(!!.x := Sepal.Length) %>% select(!!.x))

结果:

  2019-1 2019-2 2019-3
1    5.1    5.1    5.1
2    4.9    4.9    4.9
3    4.7    4.7    4.7

但是,所有这些都太复杂了。您可以这样做:

iris[,months] <- iris$Sepal.Width