根据个人代码比较数据框中的列表,如果更长则缩短一个列表

时间:2019-06-12 23:01:05

标签: r dataframe

我有两个单独的数据帧,每个数据帧分别用于一个互动双子的说话者。它们具有不同数量的交谈(行),这就是为什么我现在将它们保存在单独的文件中。

为了进行最终分析,我需要为每个发言者提供相同数量的行。

所以我想做的是在两个数据帧中比较dyad_id 1,然后通过删除所有列的最后一行来缩短更长的列表。

我准备了一个数据框来说明我已经拥有的东西。

到目前为止,我试图用dyad_id在两个数据集中拆分数据帧,以现在一个又一个地比较拆分并删除不必要的行。当我进行各种对话时,我需要使它自动化以逐一遍历所有dyad_id。

我希望有人能帮助我,我完全迷失了。

dyad_id_A <- c(1,1,1,2,2,2,2,3,3,3,3,3)
fw_quantiles_a <- c(4,3,1,2,3,2,4,1,4,5,6,7)
df_A<- data.frame(dyad_id_A,fw_quantiles_a)


dyad_id_B <- c(1,1,1,1,2,2,2,3,3,3,3)
fw_quantiles_b <- c(3,1,2,1,2,4,1,3,3,4,5)
df_B <- data.frame(dyad_id_B,fw_quantiles_b)

最终数据集的示例

dyad_id_AB <- c(1,1,1,2,2,2,3,3,3,3)

到目前为止我尝试过的事情:

split_conv_A = split(df_A, list(df_A$dyad_id_A))
split_conv_B = split(df_B, list(df_B$dyad_id_B))

2 个答案:

答案 0 :(得分:3)

在每个time组中添加一个dyad_id_x计数器,然后merge一起:

df_A$time <- ave(df_A$dyad_id_A, df_A$dyad_id_A, FUN=seq_along)
df_B$time <- ave(df_B$dyad_id_B, df_B$dyad_id_B, FUN=seq_along)

merge(
  df_A, df_B,
  by.x=c("dyad_id_A","time"), by.y=c("dyad_id_B","time")
)
#   dyad_id_A time fw_quantiles_a fw_quantiles_b
#1          1    1              4              3
#2          1    2              3              1
#3          1    3              1              2
#4          2    1              2              2
#5          2    2              3              4
#6          2    3              2              1
#7          3    1              1              3
#8          3    2              4              3
#9          3    3              5              4
#10         3    4              6              5

答案 1 :(得分:0)

也许我们可以尝试使用table来计算两个数据帧中ID的频率,前提是您在两个数据帧中具有相同的ID。使用pmin计算它们之间的最小值,并根据频率重复names

tab <- pmin(table(df_A$dyad_id_A), table(df_B$dyad_id_B))
as.integer(rep(names(tab), tab))
# [1] 1 1 1 2 2 2 3 3 3 3