2017-07-26 41 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))) 

这返回与上面相同的列。