R- 通过添加 NA 或布尔条件绑定两个不同长度的不同数据帧



>我有以下2个数据库(只显示头部和尾部)

自由度 1

dput(head(df1))
structure(list(id = c(43, 44, 45, 46, 47, 48), seed = 
c(919028655, 
119103778, 110460177, 724234636, 661955607, 1505343599)), 
row.names = c(NA, 
6L), class = "data.frame")

dput(tail(df1))
structure(list(id = c(183, 184, 185, 186, 187, 188), seed = 
c(618503388, 
1892186421, 1623243403, 1851570303, 26744271, 152317517)), 
row.names = 140:145, class = "data.frame")

这个长度为 145 行,每个参与者作为一个唯一的 ID 号。

DF 2

这是必须发送给外部法官的变量的结果。一旦他们返回数据,他们给了我一个只有 130 行的 CSV(使 cbind 变得不可能,并且对分数的怀疑与参与者的唯一 ID 匹配

)
dput(head(df2))
structure(list(Response.ID = 43:48, DTT_SCORE.fluency = c(NA, 
NA, 3L, 4L, 14L, NA), 
DTT_SCORE.fluencyAll = c(NA, 
NA, 2L, 4L, 9L, NA)), row.names = c(NA, 6L), class = 
"data.frame")
dput(tail(df2))
structure(list(Response.ID = 168:173, DTT_SCORE.fluency = 
c(NA, 
NA, NA, 6L, 5L, 5L), 
DTT_SCORE.fluencyAll = c(NA, 
NA, NA, 8L, 5L, 6L)), row.names = 125:130, class = 
"data.frame")

问题1

仅通过眼睛看,id行似乎与原始行匹配,它只是停在第130个项目。有没有办法通过强制不存在的行显示为 NA 来强制两个数据帧绑定(将 130 长 df 转换为 145 长 df,从 130 到 145 的行为空或 NA)

问题2

由于每个受访者都有一个唯一的 ID,因此是否是一种编写数据帧的方法,该数据帧仅在 df1 上的 id 与 df2 上的 id 匹配时才显示值,例如,

如果 df1$id == df2$id display (df2$DTT SCORE.fluency)*1 , else 如果 df1$id != df2$id display (df2$DTT SCORE.fluency)*0

根据您所描述的内容,您实际上需要一个连接操作。遗憾的是,如果两个表中的 id 匹配,则每行匹配,您可以使用cbind().但是,由于您无法再保证这一点,因此最好使用联接来为您进行此匹配。baseR具有merge()功能。由于DF2中的ID列名称不同,因此我只是重命名它,就像此列在DF1中的显示方式一样。

colnames(df2)[1] <- "id"
merge(df1, df2, by = "id", all.x = TRUE)

结果是:

id       seed DTT_SCORE.fluency DTT_SCORE.fluencyAll
1   43  919028655                NA                   NA
2   44  119103778                NA                   NA
3   45  110460177                 3                    2
4   46  724234636                 4                    4
5   47  661955607                14                    9
6   48 1505343599                NA                   NA
7  183  618503388                NA                   NA
8  184 1892186421                NA                   NA
9  185 1623243403                NA                   NA
10 186 1851570303                NA                   NA
11 187   26744271                NA                   NA
12 188  152317517                NA                   NA

要创建显示 DF2 中显示的 DF1 ID 的表,可以使用以下代码:

ids <- data.frame(
ids = unique(df1$id)
)
ids$test <- ids$ids %in% unique(df2$id)

结果是:

ids  test
1   43  TRUE
2   44  TRUE
3   45  TRUE
4   46  TRUE
5   47  TRUE
6   48  TRUE
7  183 FALSE
8  184 FALSE
9  185 FALSE
10 186 FALSE
11 187 FALSE
12 188 FALSE

这两个问题都可以使用dplyr*_join()函数来解决。在基本 R 中,merge()具有类似的功能。

要合并每个数据帧中的所有行,可以使用full_join()。默认情况下,*_join函数与具有相同名称的任何列匹配,但由于您的 ID 列命名不同,因此我手动指定它:

library(dpylr)
full_join(df1, df2, by = c("id" = "Response.ID"))

仅出现在一个表中的任何 ID 都将在其他列中具有NA

如果只想保留同时出现在两个数据帧中的 ID,则可以改为将full_join替换为inner_join。如果要保留所有行df1,并且仅使用df2的匹配行left_join(或right_join用于相反的方式)。

最新更新