2017-10-17 26 views
-1

我的數據是這樣的:轉換多列到現有列

data.frame(name=c("city","village"),code=c(10322,10321),plz=c(7041,7043),plz1=c(7044,7044),plz2=c(7043,NA)) 

什麼是列plz1和列plz2轉換爲PLZ最聰明的辦法:

name code plz 

city 10322 7041 

city 10322 7044 

city 10322 7043 

回答

0

首先我們melt ,將所有plz值都變爲一列(從「寬」格式移至「長」格式)。然後我們刪除「變量」列,因爲我們不需要區分plzplz1,我們將value重命名爲plz

require(reshape2) 

df1 <- data.frame(name=c("city","village"),code=c(10322,10321),plz=c(7041,7043),plz1=c(7044,7044),plz2=c(7043,NA)) 

df1 <- melt(df1, id.vars=c("name", "code")) 

df1 <- df1[,-3] 

names(df1) <- c("name", "code", "plz") 

    name code plz 
1 city 10322 7041 
2 village 10321 7043 
3 city 10322 7044 
4 village 10321 7044 
5 city 10322 7043 
6 village 10321 NA 

我們可以簡化一點,進一步結合了dplyr包:

require(dplyr) 
require(reshape2) 

df1 %>% melt(id.vars=c("name", "code")) %>% 
    select(-variable) %>% 
    rename(plz=value) 
0

使用tidyr和dplyr包。

df <- data.frame(name=c("city","village"),code=c(10322,10321), plz=c(7041,7043),plz1=c(7044,7044),plz2=c(7043,NA)) 
df %>% tidyr::gather(type, plz, plz:plz2) %>% dplyr::select(-type) %>% dplyr::filter(name == 'city') 

#name code plz 
#city 10322 7041 
#city 10322 7044 
#city 10322 7043