R 使用程序名称重复列
我有年度数据,需要分为几个月。操作非常简单,因为我只需要将年度数据平均分为几个月 我的第一步是将年度列复制12次,并使用适当的列名(月份)。下一步是将每列除以12 我被困在第一步,因为我能够创建月份列,但只填充了第一个,其余的只是NAs 请参阅下面有关Iris数据集的一些代码R 使用程序名称重复列,r,dictionary,dplyr,purrr,R,Dictionary,Dplyr,Purrr,我有年度数据,需要分为几个月。操作非常简单,因为我只需要将年度数据平均分为几个月 我的第一步是将年度列复制12次,并使用适当的列名(月份)。下一步是将每列除以12 我被困在第一步,因为我能够创建月份列,但只填充了第一个,其余的只是NAs 请参阅下面有关Iris数据集的一些代码 months <- paste(2019,seq(1,12,1), sep = "-") map_df(months, ~ iris %>% mutate(!!.x := Sepal.
months <- paste(2019,seq(1,12,1), sep = "-")
map_df(months, ~
iris %>% mutate(!!.x := Sepal.Length))
正如你所看到的,2019-1年很好(复制萼片长度),但剩下的几个月只是NAs
这里我缺少什么?如果使用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]
}
库(data.table)
iris当您可以直接为多个列赋值时,您真的需要这种方法吗
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
#...
df它们不是空的。问题是,~
右侧的表达式返回的不是列,而是tible。检查结果有多少行:
map_df(months, ~ iris %>% mutate(!!.x := Sepal.Length)) %>% nrow
结果是1800!这是因为map_df
实际上是伪装的map_dfr
,它试图绑定结果数据帧的行。因此,第一列是萼片宽度,然后是一束NA;下一列–一组NA,然后是一组值,然后是一组NA。。。让我们从iris中只取三个日期和三行:
months <- paste(2019,seq(1,3,1), sep = "-")
map_df(months, ~ iris %>% slice(1:3) %>% mutate(!!.x := Sepal.Length) %>% select(!!.x))
要获得所需内容,需要使用map\u dfc
(按列绑定):
结果:
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
iris[,months]在数据表中也更加简单。
:setDT(iris)[,(months):=Sepal.Length]
(虽然这可能不起作用,因为iris
被锁定,但您需要先复制)
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_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