2017-08-28 55 views
1

單個NA轉移到塔的底部,我有以下的數據幀:如何作爲R

example=data.frame(x=c(1,2,3),y=c(4,5,6)) 


    x  y 
1 1  4 
2 2  5 
3 3  6 

我想刪除單個值,從列的1,所以得到這個(我實現使用example$x[example$x==2]<-NA):

 x  y 
1 1  4 
2 NA 5 
3 3  6 

但現在我堅持,因爲我現在要移動的剩餘價值了,所以到NAS位於底部:

 x  y 
1 1  4 
2 3  5 
3 NA 6 

最後,我希望能夠爲兩列做到這一點,用在不同的行單值,例如:

來自:

 x  y 
1 1  NA 
2 NA 5 
3 3  6 

要:

 x  y 
1 1  5 
2 3  6 
3 NA NA 

希望有人有簡單解決方案謝謝

+2

什麼是這樣做的理由?據推測,數據幀旨在將行中的值相互關聯。通過這樣做,你改變了'x = 1'涉及'y = 4'到'x = 1'的關係涉及'y = 5'。 – Benjamin

+0

我的數據框是x =女性ID和y =男性ID。我需要根據他們的相關性將女性與男性進行匹配,這對於每對可能的情侶來說都是不同的)。一旦選擇了女性,我需要將該個體從列中移除,並且所有剩餘的ID都會向上移動,這樣就不會出現空白。 我希望能有一個簡單的解決方案,但我可能需要重新評估如何使用這些值。可能不是一個數據幀,而是單獨的數據幀。 –

+0

好消息是您的問題在您提供的上下文中有意義。更好的消息是R可能有更好的方法來進行匹配。該方法將取決於您的匹配標準。但是,這可能是一個單獨的問題。 – Benjamin

回答

2

這是一種使用is.na和子集[的方法。從這個數據集開始。

example=data.frame(x=c(1,NA,3),y=c(NA,5,6)) 
example 
    x y 
1 1 NA 
2 NA 5 
3 3 6 

您通過與lapply每個變量運行,並採取不缺少的變量,並追加到年底,這些丟失的值。然後使用example[] <-將此結果反饋回原始數據集,該數據集維護data.frame結構。

example[] <- lapply(example, function(x) c(x[!is.na(x)], x[is.na(x)])) 
example 
    x y 
1 1 5 
2 3 6 
3 NA NA 

我們也可以使用較新的(R 3.3.3)grouping功能這樣

example[] <- lapply(example, function(x) x[grouping(is.na(x))]) 

order

example[] <- lapply(example, function(x) x[order(is.na(x))]) 

在過去的兩年中,關鍵是要在訂購is.na而不是元素本身。這樣你就保留了非空元素的原始順序。

+2

該職位的作者提到他想轉移元素,而不是對它們進行排序! –

+0

@DamianoFantini很好的電話。修復。 – lmo

+1

@DamianoFantini *他*是誰? ;-) –

2

我們也可以使用tidyverse

library(dplyr) 
example %>% 
    mutate_all(funs(.[order(is.na(.))])) 
# x y 
#1 1 5 
#2 3 6 
#3 NA NA 

如果列需要依賴

example %>% 
     arrange_all(funs(is.na(.)))