2017-08-17 150 views
0

嗨,每一個這是我面臨的麻煩。在使用聚合函數tidyverse後無法用mutate創建新變量。

我有一個數據幀,它是在一個錯誤的格式。

這樣。 id | 1/3/2017| 1/4/2017 | a | 4 | 4 | b | 5 | 5 | c | 6 | 6 | d | 7 | 7 |

顯然,我想這樣的整齊格式,具有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)))

這使得我的代碼比我想要的更長,但是,我喜歡的功能是你SE不起作用

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霍拉must be length 30140 (the number of rows) or one, not 220

我會appreaciate你的幫助,因爲我是R中新的,不知道爲什麼會發生這種情況,我的直覺是,當我指定使用管道操作員執行操作的環境時,有什麼不對,但不知道如何指定正確的環境。

我很抱歉我的寫作不好,但我的母語是西班牙語,而且我的外語有點慢。

乾杯。謝謝大家。

+2

'data <- data %>%gather(date,data,2:3)%>%mutate(hour =「00:00:00」)' – donlelek

+0

好吧,謝謝你,那非常有效。祝你今天愉快。 –

+1

@donlelek,後作爲答案(和解釋)? –

回答

0

爲了達到你的目的,你可以使用:

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

在你的榜樣,你的第二次嘗試在mutate()線路出現故障。問題是rep()調用中的ncol(data)參數沒有產生正確的長度。當你發生變異的變量,你的函數應該產生任何長度1或數據的長度,在這種情況下:

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

所以你實際上並不需要重複。但在某些情況下,您必須提供與數據長度相同的矢量。在你的例子中,你試圖通過提供ncol(data)來實現,問題在於它不清楚你想要調用什麼data

在您的例子:

ncol(data) 
[1] 3 

嗯,這是既不長度1,也不您的數據的長度(gather後)。一種解決方法是通過更改爲nrow來提供數據的行數,但要小心,如果您這樣做,您將獲得原始數據的長度,而不是上一步中的數據。要使用gather步驟後使用的數據,請使用nrow(.),此處的點是上一步結果的佔位符。

所以這應該工作太:

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

我希望這個澄清的問題,您的原代碼和解決您的問題。

Buena suerte!

+0

我忘了提及,當你在多個變量和對象中使用相同的名稱時,這很令人困惑,在你的情況下,數據被稱爲數據,並且還有一個稱爲數據的變量。 – donlelek