【问题标题】:Combining rows based on conditions and saving others (in R)根据条件组合行并保存其他行(在 R 中)
【发布时间】:2021-07-21 14:02:09
【问题描述】:

我有一个关于根据两个条件组合列的问题。

我有两个来自实验的数据集,参与者必须输入代码,回答他们的性别,并记录眼动追踪数据。实验发生了两次(第一次:random1,第二次:random2)。

eye <- c(1000,230,250,400)
gender <- c(1,2,1,2)
code <- c("ABC","DEF","GHI","JKL")
random1 <- data.frame(code,gender,eye)

eye2 <- c(100,250,230,450)
gender2 <- c(1,1,2,2)
code2 <- c("ABC","DEF","JKL","XYZ")
random2 <- data.frame(code2,gender2,eye2)

现在我想合并这两个数据框。对于代码和性别匹配的所有行,应合并行(因此添加列)。这两行的代码和性别变量应分别变为一个(gender3 和 code3),并且眼动追踪数据应拆分为随机 1 的 eye_first 和随机 2 的 eye_second。

对于没有找到与其代码和性别值完美匹配的所有行,应该存在包含所有这些行的新数据集。

#this is what the combined data looks like
gender3 <- c(1,2)
eye_first <- c(1000,400)
eye_second <- c(100, 230)
code3 <- c("ABC", "JKL")
random3 <- data.frame(code3,gender3,eye_first,eye_second)

#this is what the data without match should look like
gender4 <- c(2,1,2)
eye4 <- c(230,250,450)
code4 <- c("DEF","GHI","XYZ")
random4 <- data.frame(code4,gender4,eye4)

非常感谢您的帮助!提前致谢。

【问题讨论】:

    标签: r row tidyverse


    【解决方案1】:

    为您的 2 个 data.frames 使用相同的列名并使用 merge

    random1 <- data.frame(code = code, gender = gender, eye = eye)
    random2 <- data.frame(code = code2, gender = gender2, eye = eye2)
    
    df <- merge(random1, random2, by = c("code", "gender"), suffixes = c("_first", "_second"))
    

    对于您的第二个请求,您可以使用来自dplyranti_join

    df2 <- merge(random1, random2, by = c("code", "gender"), suffixes = c("_first", "_second"), all = TRUE) # all = TRUE : keep rows with ids that are only in one of the 2 data.frame
    
    library(dplyr)
    
    anti_join(df2, df, by = c("code", "gender"))
    

    【讨论】:

    • 感谢您的回答!在这种情况下,anti-join 究竟做了什么?
    • anti_join(x, y) 返回来自x 的所有行,其中y 中没有匹配值,只保留来自x 的列。
    猜你喜欢
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2021-10-31
    • 1970-01-01
    相关资源
    最近更新 更多