代码之家  ›  专栏  ›  技术社区  ›  Science11

r通过ID将值从一个数据集传输到另一个数据集

  •  0
  • Science11  · 技术社区  · 4 年前

    我有两个数据集,第一个数据集是这样的

       ID     Weight     State
       1      12.34      NA
       2      11.23      IA
       2      13.12      IN
       3      12.67      MA 
       4      10.89      NA
       5      14.12      NA
    

    第二个数据集是按ID查找状态值的表

       ID    State
       1     WY
       2     IA
       3     MA
       4     OR
       4     CA
       5     FL
    

    如您所见,ID4有两个不同的状态值,这是正常的。

    我要做的是用dataset 2中的状态值替换dataset 1状态列中的NAs。预期数据集

      ID     Weight     State
       1      12.34      WY
       2      11.23      IA
       2      13.12      IN
       3      12.67      MA 
       4      10.89      OR,CA
       5      14.12      FL
    

    由于ID4在dataset2中有两个状态值,因此这两个值被折叠并用分隔,并用于替换dataset1中的NA。任何关于实现这一点的建议都将不胜感激。提前谢谢。

    2 回复  |  直到 4 年前
        1
  •  1
  •   Ronak Shah    4 年前

    崩溃 df2 重视并加入它 df1 通过 'ID' coalesce 使用两个状态列中的非NA值。

    library(dplyr)
    
    df1 %>%
      left_join(df2 %>%
                  group_by(ID) %>%
                  summarise(State = toString(State)), by = 'ID') %>%
      mutate(State = coalesce(State.x, State.y)) %>%
      select(-State.x, -State.y)
    
    #  ID Weight  State
    #1  1   12.3     WY
    #2  2   11.2     IA
    #3  2   13.1     IN
    #4  3   12.7     MA
    #5  4   10.9 OR, CA
    #6  5   14.1     FL
    

    merge transform .

    merge(df1, aggregate(State~ID, df2, toString), by = 'ID') |>
      transform(State = ifelse(is.na(State.x), State.y, State.x))
    
        2
  •  1
  •   hello_friend    4 年前

    Tidyverse路:

    library(tidyverse)
    df1 %>%
      left_join(df2 %>%
                  group_by(ID) %>%
                  summarise(State = toString(State)) %>%
                  ungroup(), by = 'ID') %>%
      transmute(ID, Weight, State = coalesce(State.x, State.y))
    

    基本R备选方案:

    na_idx <- which(is.na(df1$State))
    df1$State[na_idx] <- with(
      aggregate(State ~ ID, df2, toString),
      State[match(df1$ID, ID)]
    )[na_idx]
    

    df1 <- structure(list(ID = c(1L, 2L, 2L, 3L, 4L, 5L), Weight = c(12.34, 
    11.23, 13.12, 12.67, 10.89, 14.12), State = c("WY", "IA", "IN", 
    "MA", "OR, CA", "FL")), row.names = c(NA, -6L), class = "data.frame")
    
    df2 <- structure(list(ID = c(1L, 2L, 3L, 4L, 4L, 5L), State = c("WY", 
    "IA", "MA", "OR", "CA", "FL")), class = "data.frame", row.names = c(NA, 
    -6L))
    
    推荐文章