2015-09-08 64 views
3

我有我似乎無法一個問題找出R:相同的行組合成一個(優選使用dplyr/tidyr)

我有這樣

df <- data.frame(c(rep_len("a",3), "b", "b"), c(rep_len(55, 3), 44, 44),c(rep_len(12, 3), 6, 6), c("na", 2, "na", 3, "na"), c("na", "na", 4, "na", 8), c(5, "na", "na", "na", "na")) 
names(df) <- c("street", "latitude", "longitude", "A", "B", "C") 

street latitude longitude  A B C 
    a  55   12 na na 5 
    a  55   12  2 na na 
    a  55   12 na 4 na 
    b  44   6  3 na na 
    b  44   6 na 8 na 

數據幀和我想我正在尋找的是崩潰與「街道」相同的價值觀,「緯度」,「經度」行,所以數據幀看起來像這樣

street latitude longitude  A B C 
    a  55  12  2 4 5 
    b  44   6  3 8 na 

我最好的嘗試的方法是這樣的:

df %>% 
    group_by(street) %>% 
    summarise_each(funs(first)) 

但它並不完全正確。有什麼想法?

+2

一種方法是融化你的寬桌到一個長一個,刪除NAs並將其投入一個廣泛的。尋找* reshape2 *包或類似的。有些東西告訴我你可能會考慮重新設計你處理數據的方式。 – mlt

回答

1

此作品,未經改造和使用只是dplyr,只要你在的地方你"na"的使用標準NA並指定stringsAsFactors=FALSE創建df時:

df %>% 
    group_by(street, latitude, longitude) %>% 
    summarise_each(funs(ifelse(sum(is.na(.)==FALSE)==0, NA, .[which(is.na(.)==FALSE)])), matches("[A-Z]{1}")) 

# Result 
    street latitude longitude A B C 
1  a  55  12 2 4 5 
2  b  44   6 3 8 NA 

如果你喜歡堅持"na",那麼這個工程:

df %>% 
    group_by(street, latitude, longitude) %>% 
    summarise_each(funs(ifelse(sum(.!="na")==0, "na", .[which(.!="na")])), matches("[A-Z]{1}")) 
+2

另一種選擇是'summarise_each(funs(first(。[!is.na(。)]))'或'summarise_each(funs(。[。!=「na」] [1]))' – aosmith

+0

@aosmith這也是我如何做到的。 –

5

我不明白你爲什麼有"na"字符串 - R的字符/因子爲NA。無論如何,你比如說,你正在尋找這樣的:

library(data.table) 
dt = as.data.table(df) # or convert in place using setDT 

dt[, lapply(.SD, function(x) x[x != "na"]), by = .(street, latitude, longitude)] 
# street latitude longitude A B C 
#1:  a  55  12 2 4 5 
#2:  b  44   6 3 8 NA 
1

要在@ MLT的評論擴展,你可以使用tidyr(繼任reshape2)重塑這一點。它看起來像

df %>% 
    gather(type, value, -c(street, latitude, longitude)) %>% 
    na.omit %>% 
    spread(type, value) 

這將A/B/C列擴展爲行,省略NA字段,然後將其展開。

正如@eddi注意,你需要使用內置NA值,而不是字符串「NA」。我用

dfs <- 'street latitude longitude  A B C 
    a  55   12 NA NA 5 
    a  55   12  2 NA NA 
    a  55   12 NA 4 NA 
    b  44   6  3 NA NA 
    b  44   6 NA 8 NA 
' 
df <- read.table(text=dfs, header=T) 
相關問題