使用来自相同键索引的值填充空白字段
Fill in Blank Fields With a Value From Same Key Index
我有一组数据(10 列,1000 行),这些数据由一个或多个这些行可以共享的 ID 号索引。举一个小例子来说明我的观点,考虑这个 table:
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
我需要所有条目都在“位置”字段中包含一些内容,而我在尝试这样做时遇到了麻烦。
注意事项:
- 每个唯一 ID 号至少有一行填充了位置字段。
- 如果两行具有相同的ID号,则它们具有相同的位置。
- 两个不同的身份证号码可以有相同的位置。
- 身份证号不一定是连续的,也不一定是全数字的。它们的排列对我来说并不重要,因为任何相关的行都共享相同的 ID 号。
有什么解决方案吗?我目前在 data.table
包中使用 R,但我对它比较陌生。
我们可以将'data.frame'转换为'data.table'(setDT(df1)
),按'ID'分组,得到Location
中不属于[=的元素14=](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
或者我们可以按照@Frank
的建议使用setdiff
setDT(df1)[, Location:= setdiff(Location,'')[1L], by = ID][]
我有一组数据(10 列,1000 行),这些数据由一个或多个这些行可以共享的 ID 号索引。举一个小例子来说明我的观点,考虑这个 table:
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
我需要所有条目都在“位置”字段中包含一些内容,而我在尝试这样做时遇到了麻烦。
注意事项:
- 每个唯一 ID 号至少有一行填充了位置字段。
- 如果两行具有相同的ID号,则它们具有相同的位置。
- 两个不同的身份证号码可以有相同的位置。
- 身份证号不一定是连续的,也不一定是全数字的。它们的排列对我来说并不重要,因为任何相关的行都共享相同的 ID 号。
有什么解决方案吗?我目前在 data.table
包中使用 R,但我对它比较陌生。
我们可以将'data.frame'转换为'data.table'(setDT(df1)
),按'ID'分组,得到Location
中不属于[=的元素14=](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
或者我们可以按照@Frank
的建议使用setdiff
setDT(df1)[, Location:= setdiff(Location,'')[1L], by = ID][]