2015-03-25 45 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