我有一张看起来如下的桌子:
姓名 | 地区 | 身份证 |
---|---|---|
姓名1 | 美国 | 123 |
姓名1 | 美国 | |
姓名2 | 美国 | 122 |
姓名3 | 美国 | 124 |
姓名1 | 英国 | |
姓名1 | 英国 | 135 |
姓名2 | 英国 | 140 |
姓名3 | 美国 |
如您所见,ID 列中有空值,如果列名称和区域对应,我希望用其他行的值填充这些值。所以它应该看起来像这样:
姓名 | 地区 | 身份证 |
---|---|---|
姓名1 | 美国 | 123 |
姓名1 | 美国 | 123 |
姓名2 | 美国 | 122 |
姓名3 | 美国 | 124 |
姓名1 | 英国 | 135 |
姓名1 | 英国 | 135 |
姓名2 | 英国 | 140 |
姓名3 | 美国 |
某些列仍为空,但大多数都没有问题。 R中有没有办法做到这一点? 也许在 Excel 中会更容易(Vlookup 也许我不确定)。如果您有任何想法,请分享)
行的顺序在这里很重要,例如 - 第 4 行中的 Name3 US 和第 8 行不相关。我们可以使用
consecutive_id
创建一个新组,然后使用 fill
值。
library(dplyr)
library(tidyr)
df %>%
mutate(group_id = consecutive_id(Name, Region)) %>%
group_by(group_id) %>%
fill(Id, .direction = "downup") %>%
ungroup
# A tibble: 8 × 4
# Name Region Id group_id
# <chr> <chr> <int> <int>
#1 Name1 US 123 1
#2 Name1 US 123 1
#3 Name2 US 122 2
#4 Name3 US 124 3
#5 Name1 UK 135 4
#6 Name1 UK 135 4
#7 Name2 UK 140 5
#8 Name3 US NA 6
数据
如果您以 可重现的格式提供数据
,帮助会更容易df <- structure(list(Name = c("Name1", "Name1", "Name2", "Name3", "Name1",
"Name1", "Name2", "Name3"), Region = c("US", "US", "US", "US",
"UK", "UK", "UK", "US"), Id = c(123L, NA, 122L, 124L, NA, 135L,
140L, NA)), row.names = c(NA, -8L), class = "data.frame")