2017-07-26 50 views
0

我有這個data.table:如何R中兩列結合data.table這樣的:

CITY   CITY2 
Phoenix  NA 
NASHVILLE Nashville 
Los Angeles Los Angeles 
NEWYORK  New York 
CHICAGO  NA 

這是結果,我想:

CITY 
Phoenix 
Nashville 
Los Angeles 
New York 
CHICAGO 

我試過在很多方面和沒有工作。任何想法?

+0

請使用dput來提供更容易使用的示例數據,幷包含您之前的一些嘗試,以便我們可以更輕鬆地爲您提供幫助。 –

+1

'df2 < - ifelse(is.na(df $ CITY2),df $ CITY,df $ CITY2)' –

回答

0

由於我失望我沒有停止過研究,並找到了解決辦法:

myDataTable[ is.na(CITY2) & !is.na(CITY), CITY2 := CITY, ] 
+1

這是'data.table'語法。這是打算?你的問題既沒有提到'data.table'也沒有被標記爲這樣。 – Uwe

+0

'myDataTable [is.na(CITY2),CITY2:= CITY]'會給出相同的結果。 「城市」中的任何「NA」都將被複制到「CITY2」中,替代「NA」。 – Uwe

0

這是一個有點數據幀的亂七八糟的,你有兩列一些理想的結果,但有似乎是一個缺乏的可預測性。你確定city2對所有不是NA的值都有正確的格式嗎? 無論採用哪種方法,都有幾種方法可以使用dplyr和「工具」軟件包以正確的城市名稱大寫形式獲得最終所需的答案。

library(dplyr) 
library(tools) 
city_df <- data.frame(
city = c("Phoenix", "NASHVILLE", "Los Angeles", "NEWYORK", "CHICAGO"), 
city2 = c(NA, "Nashville", "Los Angeles", "New York", NA), 
stringsAsFactors = FALSE) 

第一種方法假定city_df $ city包含所有城市但格式不正確。

city_df %>% 
mutate(city = 
     replace(x = city, city == "NEWYORK", values = "New York")) %>% 
select(city) %>% 
mutate(city = tools::toTitleCase(tolower(city))) 

返回

 city 
1  Phoenix 
2 Nashville 
3 Los Angeles 
4 New York 
5  Chicago 

如果您需要df_city $城市與df_city $城2的非NA值替換的值,你可以做到以下幾點:

city_df %>% 
mutate(city = case_when(
         !(is.na(city2)) ~ city2, 
         is.na(city2) ~ city)) %>% 
select(city) %>% 
mutate(city = tools::toTitleCase(tolower(city))) 

這返回與上面相同的列。