【问题标题】:Using a conditional in a for loop to create a unique panel id在 for 循环中使用条件来创建唯一的面板 ID
【发布时间】:2019-03-27 20:32:26
【问题描述】:

我有一个如下所示的数据集:

# 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)且可能无错误的方法来处理此问题?

【问题讨论】:

  • zoo::na.locf(id2, fromLast = TRUE)

标签: r for-loop data.table tidyverse


【解决方案1】:

你能不能不顺其自然:

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)

【讨论】:

  • 嗨,deann,你能解释一下mutate(uniqueId = id2 %&gt;% discard(is.na) %&gt;% unique) %&gt;% 行的确切作用吗?对于第二个解决方案,我想我和我自己的解决方案有同样的问题。如前所述,我真的不能手动检查。
  • 它为每个组创建 uniqueId,id 将等于 id2 的值,丢弃 NA 值
猜你喜欢
  • 2020-05-25
  • 2021-07-30
  • 2011-12-08
  • 1970-01-01
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
相关资源
最近更新 更多