我有年度数据,我需要分成几个月。操作非常容易,因为我只需要平均分配几个月的年度数据。
我的第一步将是复制年度列12次,已经具有适当的列名(月份)。下一步是将每一列除以12。
我被困在第一步,因为我能够创建月份列,但只有第一列是填充的,其余的只是NAs。
请参阅下面带有Iris数据集的一些代码
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),但剩下的几个月只是NAs。
我在这里错过了什么?
发布于 2019-08-02 09:18:33
它们不是空的。问题是,~右侧的表达式返回的不是列,而是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发布于 2019-08-02 09:17:16
当您可以直接将值赋值给多个列时,您真的需要此方法吗?
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
#... 发布于 2019-08-02 09:06:03
如果您使用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))
}https://stackoverflow.com/questions/57323018
复制相似问题