首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有编程名称的重复列

具有编程名称的重复列
EN

Stack Overflow用户
提问于 2019-08-02 08:53:25
回答 3查看 214关注 0票数 1

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

我的第一步将是复制年度列12次,已经具有适当的列名(月份)。下一步是将每一列除以12。

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

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

代码语言:javascript
运行
复制
months <- paste(2019,seq(1,12,1), sep = "-")
map_df(months, ~
             iris %>% mutate(!!.x := Sepal.Length))
代码语言:javascript
运行
复制
   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。

我在这里错过了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-02 09:18:33

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

代码语言:javascript
运行
复制
map_df(months, ~ iris %>% mutate(!!.x := Sepal.Length)) %>% nrow

结果是1800人!这是因为map_df实际上是伪装的map_dfr,它试图绑定结果数据帧的行。因此,第一列是Sepal.Width,然后是NA;下一列是NA,然后是值,然后是NA.让我们只从虹膜取三个日期和三排:

代码语言:javascript
运行
复制
months <- paste(2019,seq(1,3,1), sep = "-")
map_df(months, ~ iris %>% slice(1:3) %>% mutate(!!.x := Sepal.Length) %>% select(!!.x))

结果是

代码语言:javascript
运行
复制
  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 (按列绑定):

代码语言:javascript
运行
复制
map_df(months, ~ iris %>% slice(1:3) %>% mutate(!!.x := Sepal.Length) %>% select(!!.x))

结果:

代码语言:javascript
运行
复制
  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

然而,这一切都太复杂了。你可以这样做:

代码语言:javascript
运行
复制
iris[,months] <- iris$Sepal.Width
票数 0
EN

Stack Overflow用户

发布于 2019-08-02 09:17:16

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

代码语言:javascript
运行
复制
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
#... 
票数 2
EN

Stack Overflow用户

发布于 2019-08-02 09:06:03

如果您使用for循环来完成这一操作,那么这不会是一个大问题。在这里,我提供了一个使用{data.table}实现该操作的示例。

代码语言:javascript
运行
复制
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}不太熟悉,我可以给出类似的等价物,但是可以有更好的方法来实现。

代码语言:javascript
运行
复制
for(i in 1:12){

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

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57323018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档