我有一个数据帧,其中每一行代表一个空间单元.nbid*变量表示哪个单元是相邻单元.我想把邻居的dum变量放入主数据帧.(它可以是数据框架内的任何类型的关系,而不是空间单元-业务伙伴、亲属、相关基因等.)

seed(999)
df_base <- data.frame(id = seq(1:100),
                 dum= sample(c(rep(0,50), rep(1,50)),100),
                 nbid_1=sample(1:100,100),
                 nbid_2=sample(1:100,100),
                 nbid_3=sample(1:100,100)) %>% 
  mutate(nbid_1 =  replace(nbid_1, sample(row_number(), size = ceiling(0.1 * n()), replace = FALSE), NA),
         nbid_2 =  replace(nbid_2, sample(row_number(), size = ceiling(0.3 * n()), replace = FALSE), NA),
         nbid_3 =  replace(nbid_3, sample(row_number(), size = ceiling(0.7 * n()), replace = FALSE), NA))

(在这些简化数据中,而不是在真实数据中,邻居1、2和3可以是相同的,但这与问题无关.)

我的方法是复制并连接数据,如下所示:

df1 <- df_base
df2 <- df_base %>% 
  select(-c(nbid_1,nbid_2,nbid_3)) %>% 
  rename(nbdum=dum)

df <- left_join(df1,df2,by=c("nbid_1"="id")) %>% 
  rename(nbdum1=nbdum) %>% 
  left_join(.,df2,by=c("nbid_2"="id")) %>% 
  rename(nbdum2=nbdum) %>% 
  left_join(.,df2,by=c("nbid_3"="id")) %>% 
  rename(nbdum3=nbdum)

df是我正在寻找的结果-从这里我可以创建一个整体邻居虚拟或计数.

我如何才能以不那么笨拙的方式解决这个问题?

提前感谢您的 idea !!

推荐答案

一个关键的线索是,当你看到var_1, var_2, ..., var_n时,它表明数据可以转换为更长的数据.参见pivot_longer()data.table::melt(),其中经常讨论molten个数据.

例如,我们可以透视df2表,然后将其连接回来.我不确定是否需要这种格式,但在加入之后,我们可以用pivot_wider()键回到广角.

library(dplyr)
library(tidyr)


df1 %>%
  select(!id) %>%
  pivot_longer(cols = starts_with("nbid"), names_prefix = "nbid_")%>%
  mutate(original_id = rep(1:100, each = 3))%>%
  left_join(df2, by = c("value" = "id"))%>%
  pivot_wider(original_id, values_from = c(value, nbdum))

#> # A tibble: 100 × 7
#>    original_id value_1 value_2 value_3 nbdum_1 nbdum_2 nbdum_3
#>          <int>   <int>   <int>   <int>   <dbl>   <dbl>   <dbl>
#>  1           1      25      90      23       0       0       1
#>  2           2      12      NA      NA       1      NA      NA
#>  3           3      11      40      47       0       0       0
#>  4           4      94      87      NA       0       1      NA
#>  5           5      46      77      NA       1       0      NA
#>  6           6      98      82      NA       1       0      NA
#>  7           7      43      NA      NA       1      NA      NA
#>  8           8      74      NA       7       0      NA       1
#>  9           9      57      NA      NA       1      NA      NA
#> 10          10      49      72      NA       0       0      NA
#> # … with 90 more rows

## compare to original

as_tibble(df)
#> # A tibble: 100 × 8
#>       id   dum nbid_1 nbid_2 nbid_3 nbdum1 nbdum2 nbdum3
#>    <int> <dbl>  <int>  <int>  <int>  <dbl>  <dbl>  <dbl>
#>  1     1     0     25     90     23      0      0      1
#>  2     2     1     12     NA     NA      1     NA     NA
#>  3     3     1     11     40     47      0      0      0
#>  4     4     1     94     87     NA      0      1     NA
#>  5     5     0     46     77     NA      1      0     NA
#>  6     6     1     98     82     NA      1      0     NA
#>  7     7     1     43     NA     NA      1     NA     NA
#>  8     8     0     74     NA      7      0     NA      1
#>  9     9     0     57     NA     NA      1     NA     NA
#> 10    10     0     49     72     NA      0      0     NA
#> # … with 90 more rows

R相关问答推荐

用dDeliverr用第二个表更新一个表

使用gggplot 2在R中正确表示翻转堆叠条形图中的数据

如何按行和列组合多个格式?

过滤Expand.Grid的结果

R -模运算后的加法

在(g)子中使用asserable字符

如何使用rmarkdown和kableExtra删除包含折叠行的表的第一列的名称

保存包含循环和ifelse的函数的输出

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

单个轮廓重叠条的单独图例

为什么当用osmdata映射R时会得到相邻状态?

在RStudio中堆叠条形图和折线图

将二进制数据库转换为频率表

R:用GGPLATE,如何在两个独立的变量中制作不同形状的散点图?

在R中创建连续的期间

手动指定从相同数据创建的叠加图的 colored颜色

优化从每个面的栅格中提取值

`-`是否也用于数据帧,有时使用引用调用?

数值型数据与字符混合时如何进行绑定

如何获取R chromote中的当前URL?