R 使用程序名称重复列

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.

我有年度数据,需要分为几个月。操作非常简单,因为我只需要将年度数据平均分为几个月

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

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

请参阅下面有关Iris数据集的一些代码

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