2015-03-25 23 views
3

我有一組數據(10列,1000行),它們由一個或多個這些行可共享的ID號索引。舉一個小例子來說明我的觀點,認爲這是桌子:使用相同密鑰索引中的值填充空白字段

ID  Name  Location 
5014  John  
5014  Kate  California 
5014  Jim 
5014  Ryan  California 
5018  Pete  
5018  Pat  Indiana 
5019  Jeff  Arizona 
5020  Chris Kentucky 
5020  Mike 
5021  Will  Indiana 

我需要的所有條目有在位置字段中的東西,我有一個時間試圖做一個地獄。

注意事項:

  1. 每一個唯一的ID號碼至少有一排用填充位置字段。
  2. 如果兩行具有相同的ID號,則它們具有相同的位置。
  3. 兩個不同的ID號可以有相同的位置。
  4. 身份證號碼不一定是連續的,也不一定是完全數字的。它們的排列對我來說並不重要,因爲任何相關的行都有相同的ID號。

解決方案的任何想法?我目前使用R與data.table包,但我相對較新。

回答

4

我們可以將'data.frame'轉換爲'data.table'(setDT(df1)),按'ID'分組,得到Location''Location[Location!=''][1L])的元素。假設,如果存在不屬於''每組多於一個的元件,所述[1L]是,選擇第一非空白元件,並分配(:=)輸出到Location

library(data.table) 
setDT(df1)[, Location := Location[Location != ''][1L], by = ID][] 
#  ID Name Location 
# 1: 5014 John California 
# 2: 5014 Kate California 
# 3: 5014 Jim California 
# 4: 5014 Ryan California 
# 5: 5018 Pete Indiana 
# 6: 5018 Pat Indiana 
# 7: 5019 Jeff Arizona 
# 8: 5020 Chris Kentucky 
# 9: 5020 Mike Kentucky 
#10: 5021 Will Indiana 

或者,我們可以使用setdiff所建議by @Frank

setDT(df1)[, Location:= setdiff(Location,'')[1L], by = ID][] 
+0

工程就像一個魅力,謝謝!你介意點解釋一下嗎?在列操作之後但在「by = ID」之前有空白的「,,」是什麼語法推理?爲什麼[]之後?對不起,我是新手。試圖瞭解解決方案背後的原因 – 2015-03-25 12:35:45

+1

@JeffY添加了一些解釋。 '[]'不是必需的。這只是將輸出打印到控制檯。 – akrun 2015-03-25 12:41:18

+2

':= setdiff(Location,'')'或':= setdiff(Location,'')[1L]'是另一種選擇。 – Frank 2015-03-25 13:13:54