使用收集函数tidyverse后,无法使用mutate创建新变量。

时间:2017-08-17 17:40:26

标签: r dplyr tidyr tidyverse

嗨,每一个人都是我面临的麻烦。

我的数据框格式错误。

就这样。 id | 1/3/2017| 1/4/2017 | a | 4 | 4 | b | 5 | 5 | c | 6 | 6 | d | 7 | 7 |

显然我想要这样整洁的格式,以及00:00:00小时的附加列 id | date | hour |data| a | 1/3/2017 |00:00:00 |4 | b | 1/3/2017 |00:00:00 |5 | c | 1/3/2017 |00:00:00 |6 | d | 1/3/2017 |00:00:00 |7 | a | 1/4/2017 |00:00:00 |4 | b | 1/4/2017 |00:00:00 |5 | c | 1/4/2017 |00:00:00 |6 | d | 1/3/2017 |00:00:00 |7 |

执行此操作的代码如下

data <- data %>% gather(date, data, "1/3/2017":"1/4/2017")

data <- data %>% mutate(hour = rep("00:00:00", ncol(data)))

这使我的代码比我想要的更长,但是,我喜欢使用的功能不起作用

data <- data %>% gather(date, data, "1/3/2017":"1/4/2017") %>% mutate(hour = rep("00:00:00", ncol(data)

我得到的错误消息如下

Error in mutate_impl(.data, dots) : Column的Hora must be length 30140 (the number of rows) or one, not 220

我愿意帮助你,因为我是R的新手并且不知道为什么会发生这种情况,我的直觉是当我指定环境时,某些事情是错误的,其中%>% magrittr执行了操作管道操作员,但不知道如何指定正确的环境。

我很抱歉我的写作不好,但我的母语是西班牙语,而且我的外语有点慢。

干杯。谢谢大家。

1 个答案:

答案 0 :(得分:0)

为了实现您的目标,您可以使用:

data <- data %>% 
  gather(date, data, 2:3) %>% 
  mutate(hour = "00:00:00")

在您的示例中,您的第二次尝试在mutate()行中失败。问题是ncol(data)调用中的rep()参数没有产生正确的长度。当你改变变量时,你的函数应该产生长度1或数据的长度,在这种情况下:

length("00:00:00")
[1] 1

所以你实际上并不需要重复它。但在某些情况下,您必须提供与数据长度相同的向量。在您的示例中,您尝试通过提供ncol(data)来执行此操作,问题是您不清楚要调用的data是什么。

在你的例子中:

ncol(data)
[1] 3 

嗯,这不是长度1,也不是数据的长度(gather之后)。一种解决方案是通过更改为nrow来提供数据行数,但要小心,如果执行nrow(data),您将获得原始数据的长度,而不是来自前一步。要使用gather步骤后nrow(.)使用的数据,此处的点是上一步结果的占位符。

所以这也应该有效:

data %>% 
  gather(date, data, 2:3) %>%
  mutate(hour = rep("00:00:00", nrow(.))) 

我希望这可以澄清原始代码的问题并解决您的问题。

Buena suerte!