我有一个如下所示的数据集:
# A tibble: 5,458 x 539
# Groups: country, id1 [2,729]
idstd id2 xxx id1 country year
<dbl+> <dbl> <dbl+lbl> <dbl+lbl> <chr> <dbl>
1 445801 NA NA 7 Albania 2009
2 542384 4616555 1163 7 Albania 2013
3 445802 NA NA 8 Albania 2009
4 542386 4616355 1162 8 Albania 2013
5 445803 NA NA 25 Albania 2009
6 542371 4616545 1161 25 Albania 2013
7 445804 NA NA 30 Albania 2009
8 542152 4616556 475 30 Albania 2013
9 445805 NA NA 31 Albania 2009
10 542392 4616542 1160 31 Albania 2013
数据是paneldata,但是没有唯一的panel-id。例如,前两个观察结果是来自阿尔巴尼亚的 7 号受访者,但其他国家再次使用了 7 号。id2
然而是独一无二的。因此,我的计划是复制id2
到NA
相应受访者的条目中。
我写了以下代码:
for (i in 1:nrow(df)) {
if (df$id1[i]== df$id1[i+1] & df$country[i] == df$country[i+1]) {
df$id2[i] <- df$id2[i+1]
}}
这给出了以下错误:
Error in if (df$id1[i] == df1$id1[i + 1] & : missing value where TRUE/FALSE needed
然而,它似乎有效。由于我的数据集很大,而且我不是很熟练,所以我不太愿意接受我提出的解决方案,尤其是当它出现错误时。
任何人都可以帮我解释这个错误吗?
此外,是否有更有效的(例如 data.table)并且可能没有错误的方法来处理这个问题?
你能不能不做点什么:
library(tidyverse)
df %>%
group_by(country, id1) %>%
mutate(uniqueId = id2 %>% discard(is.na) %>% unique) %>%
ungroup()
此外,通过查看您的循环,我判断 NA 始终与唯一 ID 相距 1 行,因此您也可以这样做:
df %>%
mutate(id2Lag = lag(id2),
uniqueId = ifelse(is.na(id2), id2Lag, id2) %>%
select(-id2Lag)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句