我有需要分成几个月的年度数据。操作非常容易,因为我只需要将几个月中的年度数据平均分配即可。
我的第一步是将年度列复制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。
我在这里想念什么?
答案 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