2013-11-09 84 views
0

我有一個下面的示例數據。如何重新排列數據?

classobj var1 var2 var3 var4 
     1  2  0  10  4 
     2  1  1  64  2 
     2  3  1  15  2 
     2  1  2  46  1 
     2  3  1  13  1 
     1  2  0  10  4 
     2  1  1  45  2 
     2  2  2  45  2 
     2  3  1  11  1 
     2  3  2  9  1 

classobj=1是家庭和classobj==2是家庭的成員。所以這部分數據屬於1個家庭。

classobj var1 var2 var3 var4 
     1  2  0  10  4 
     2  1  1  64  2 
     2  3  1  15  2 
     2  1  2  46  1 
     2  3  1  13  1 

我想要做的是刪除一行classobj==1中的所有值。然後從classobj==2尋找var1==1(家庭的負責人)。複製var1==1的所有行值並將其作爲「classobj == 1」的值添加。如果有超過1 var==1,則查找var3。將var3的值複製爲最高值。

編輯:輸出應該是這個

classobj var1 var2 var3 var4 
     1  1  1  64  2 
     2  1  1  64  2 
     2  3  1  15  2 
     2  1  2  46  1 
     2  3  1  13  1 
     1  1  1  45  2 
     2  1  1  45  2 
     2  2  2  45  2 
     2  3  1  11  1 
     2  3  2  9  1 

IM規劃使用此代碼刪除所有的值,如果classobj==1

DF[DF$Classobj == 1, 2:4] <- NA 

剩餘的概率將是我怎麼能找var1==1和複製它的值。

PS。

對不起。它不應該是var2,而是var3。我編輯了這篇文章。

+0

是您的數據排序?即'classobj = 1,2,2,1,2,2,2,1,2,2 ......' – N8TRO

+1

在你的例子中,不應該將'var2 == 2'的行復制? – TheComeOnMan

+0

@Codoremifa:只應複製從var1到var4的值。應該保留classobj的所有值。 – dixi

回答

1

我有一種感覺,我失去了一些東西的問題,或者誤讀,但我這樣的思考 -

library(data.table) 
dt <- data.table(df) 

# columns for which value is to be copied 
valuecolumns = setdiff(colnames(dt),'classobj') 

# marking each family with a unique flag 
dt[,flag := 0] 
dt[classobj == 1,flag := 1] 
dt[,flag := cumsum(flag)] 

# temporarily removing the classobj == 1 rows 
dt <- dt[classobj != 1] 

# marking cases where unique var1 = 1 is there 
dt[,var1eq1 := .SD[var1 == 1, .N], by = 'flag'] 

# re-addingclassobj == 1 rows where multiple var1 == 1 exist 
dt <- rbind(dt,dt[var1eq1 > 1 & classobj != 1, .SD[which.max(var2)], by = 'flag'][,classobj := as.integer(1)]) 
# re-addingclassobj == 1 rows with max var2 values 
dt <- rbind(dt,dt[var1eq1 == 1 & classobj != 1, .SD[var1 == 1], by = 'flag'][,classobj := as.integer(1)]) 

輸出 -

> dt 
    classobj var1 var2 var3 var4 flag var1eq1 
1:  2 1 1 64 2 1  2 
2:  2 3 1 15 2 1  2 
3:  2 1 2 46 1 1  2 
4:  2 3 1 13 1 1  2 
5:  2 1 1 45 2 2  1 
6:  2 2 2 45 2 2  1 
7:  2 3 1 11 1 2  1 
8:  2 3 2 9 1 2  1 
9:  1 1 2 46 1 1  2 
10:  1 1 1 45 2 2  1 
+0

感謝您的支持!不過,當我運行關於rbind的最後兩個代碼時,我得到錯誤...警告消息: 在data.table ::。rbind.data.table(...)中: 參數2的名稱按不同順序排列。列將按名稱綁定以與基數保持一致。您可以刪除名稱(使用未命名的列表),然後按位置連接列,或設置use.names = FALSE。或者,明確地將use.names設置爲TRUE將刪除此警告。 – dixi

+0

此代碼暫時刪除classobj == 1行 dt < - dt [classobj!= 1]刪除classobj == 1的行。 因此,此處的代碼創建一個新的變量var1eq1,其值全爲1. #標記唯一var1 = 1的情況 dt [,var1eq1:= .SD [var1 == 1,.N],by ='flag'] – dixi

+0

該警告就像它說的那樣,是關於不在相同的順序和r按名稱綁定列。完全不用擔心。我不明白你的第二個評論。 – TheComeOnMan