根据列名称和因素将数据从一个数据帧收集到另一个数据帧

时间:2018-07-07 12:22:25

标签: r dataframe dplyr data.table lapply

我需要从一个数据集中收集一些数据。

我使这个示例更简单:

数据集1:

ID_marquesina<-c("1","1","1","2","2")
profile<-c("Good","Bad","Good","Normal","Bad")
Vis_profile<-c("10","20","30","5","0")

Vis_marquesina_profile<-data.frame(ID_marquesina,profile,Vis_profile)

数据集2:

ID<-c("1","2","3","4")
Good<-NA
Bad<-NA
Normal<-NA
Dataset_Marquesinas<-data.frame(ID,Good,Bad,Normal)

在第一个数据集中可以看到一个名为profile(“好”,“差”,“正常”)的变量,它们是第二个数据集中的列名。

两个数据集中还存在ID,两个数据集中都存在ID“ 1”,“ 2”,而其他ID则不存在。

我需要做的是:

用来自数据集1的数据填充数据集2。因此,例如,如果在数据集1中ID_marquesina = 1且profile =“ Good”。取Vis_profile(10)并将其放入ID = 1且列= Good的数据集2中。

我尝试了lapply函数和一些if循环,但是我无法使其工作!

任何建议将不胜感激!!

谢谢!

1 个答案:

答案 0 :(得分:1)

我们可以通过spread绑定第一个数据集并将其与第二个数据集绑定以填充值来做到这一点

library(dplyr)
Vis_marquesina_profile %>% 
    group_by(ID = ID_marquesina, profile) %>%
    summarise(Vis_profile = mean(Vis_profile)) %>%
    spread(profile, Vis_profile) %>% 
    bind_rows(Dataset_Marquesinas) %>%
    group_by(ID) %>% 
    summarise_all(funs(mean(., na.rm = TRUE)))

另一种选择是通过更改factor以将'ID_marquesina'更改为levels,以包括第二个数据集中的'ID'列的级别

Vis_marquesina_profile %>% 
   group_by(ID = factor(ID_marquesina, levels = Dataset_Marquesinas$ID), 
            profile) %>% 
   summarise(Vis_profile = mean(Vis_profile)) %>%
   spread(profile, Vis_profile, drop = FALSE)

注意:每个组有多个“ Vis_profile”值(“ ID_marquesina”,“ profile”),目前尚不清楚我们是否需要使用meansum或{{1 }}等(该列为max,将其更改为factor