>我有以下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()
.但是,由于您无法再保证这一点,因此最好使用联接来为您进行此匹配。base
R具有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
用于相反的方式)。