【问题标题】:Conditional replacement if values on a row match如果行上的值匹配,则条件替换
【发布时间】:2018-02-24 12:36:30
【问题描述】:

我必须分析经济学实验中的数据。 因此,我有一个数据库(14 976 obs),我将其分为两部分:一个用于类型 1 的卖家(7488 obs),另一个用于类型 2(7488 obs)的买家,每个数据库有 212 个变量。

这里,你有两个数据库的一部分:

sellers
ID       Gender   Period   Matching group   Group    Type  Overcharging ...
654        1           1            73         1        1      NA
654        1           2            73         1        1      NA
654        1           3            73         1        1      NA
654        1           4            73         1        1      NA 
435        1           1            73         2        1      NA
435        1           2            73         2        1      NA
435        1           3            73         2        1      NA
435        1           4            73         2        1      NA 

buyers
 ID       Gender   Period   Matching group   Group    Type  Overcharging ...
 708        0           1            73         1        2       1
 708        0           2            73         1        2       0
 708        0           3            73         1        2       0
 708        0           4            73         1        2       1   
 546        1           1            73         2        2       0
 546        1           2            73         2        2       0
 546        1           3            73         2        2       1
 546        1           4            73         2        2       0

我有很多变量,比如 Overcharge 一个,其中信息放在买家行而不是卖家行中。所以我想做的是替换卖家数据库中的这些信息。

为此,我有很多信息: 例如,在匹配组 73 中,我们知道在第 1 阶段受试者 708 被多收费用(组 1 中的那个)。据我所知,这个人属于第 1 组和第 73 组,我能够识别出在第 1 期向他多收费用的卖家:主题 654,性别 =1。

因此,我想在卖家数据框架上放置过度收费(和其他一些)买家的价值观,以分析卖家的行为,但在正确的时期,针对正确的组和正确的匹配组。

【问题讨论】:

    标签: r database loops replace conditional-statements


    【解决方案1】:

    您可以执行合并以获得所需的信息。

    # Select the Period, Matching Group, Group and Overcharging columns
    # Selection by column ID (2nd, 3rd, 4th, 6th columns)
    buyers_merge <- buyers[, c(2,3,4,6)]
    # Rename the Overcharging column
    names(buyers_merge)[4] <- "Overcharging_Buyers"
    # Merge
    sellers_merged <- merge(sellers, buyers_merge)
    

    现在,如果我正确编写了上面的代码,这应该将 Overcharging_Buyers 列添加到卖方表的副本中。由于 4 个列名中有 3 个匹配,因此合并功能应自动合并这些列并将不匹配的列添加为新列。然后,您可以用新添加的信息替换原来的 Overcharge 列。

    有关合并功能的更多信息,请参阅here

    【讨论】:

      【解决方案2】:
      library(dplyr)
      #join both dataframes on common columns
      merged_df <- left_join(sellers, buyers, by=c('Period', 'Matching_group', 'Group'))
      
      #find row_index which have missing "Overcharging" in sellers
      idx <- which(is.na(merged_df$Overcharging.x))
      merged_df[idx, "Overcharging.x"] <- merged_df[idx, "Overcharging.y"]
      
      #drop unwanted columns to have the updated sellers
      sellers_updated <- merged_df[,-c(dim(sellers)[2]+1: dim(merged_df)[2])]
      colnames(sellers_updated) <- colnames(sellers)
      sellers_updated
      

      【讨论】:

      • 感谢您的回答,但是我尝试了您的解决方案,但它不起作用。它为我创造了比我原来的数据库更多的观察结果......
      • 可能您在buyers 数据框中有多个Period, Matching_group, Group 组合的记录。您可以通过library(dplyr); buyers %&gt;% group_by(Period, Matching_group, Group) %&gt;% summarise(n=n()) %&gt;% filter(n &gt; 1) 确认这一点
      猜你喜欢
      • 2021-04-15
      • 2021-03-15
      • 2021-11-18
      • 1970-01-01
      • 2020-12-01
      • 2015-08-18
      • 2011-05-26
      • 2011-04-20
      • 2022-01-13
      相关资源
      最近更新 更多