【问题标题】:R Compare Columns across Dataframes to Match ValuesR比较跨数据框的列以匹配值
【发布时间】:2015-10-06 15:17:48
【问题描述】:

我有两个数据框,分别查看房屋 (n=6) 和某些日期 (n=22)。

  • ORIGINAL 是原始数据集。它包含对 5 个变量的 38 个观察值。并非所有房屋都列出了所有日期,反之亦然,导致不同长度变量的计算错误。

  • SAMPLE 是一个新的空数据集。它包含对相同 5 个变量的 132 (6 x 22) 个观测值。现在每个日期都有每个家庭的观察结果。

    宅日獴果象

         A       1      40        7      0.6
         A       6      32        12     4.2
         B       2      50        3      4.0 
         B       4      51        4      8.6
         B       6       8        7      12.1  
         C       2      12        8      13.0
    

我试图通过要求 R 比较两个数据帧之间的 HouseID 和 Date 来填写 SAMPLE 的其余部分;如果它们匹配,则应复制其余变量(猫鼬、水果、大象)以进行该观察。

我试过这个没有用...

 for(i in 1:nrow(original))
{
  if ((sample$Day == original$Day) && (sample$House == original$House)) 
  {
    sample$Mongoose[i]  <- original$Mongoose[i] 
    sample$Fruit[i]     <- original$Fruit[i] 
    sample$Elephant[i]  <- original$Elephant[i] 
  }
}

以下结果:

我依次收到以下 3 个错误

  • 在 sample$Day == test$Day 中:较长的对象长度不是 更短的对象长度

  • 在 is.na(e1) | is.na(e2) :更长的对象长度不是的倍数
    更短的对象长度

  • 在==.default(sample$House, test$House) 中:更长的对象长度是
    不是较短对象长度的倍数

数据确实复制了,但不正确。所有值都转移到 A 房屋和连续日期,而不是适当的房屋和日期。

也就是说,它看起来像这样

House   Day   Mongoose   Fruit  Elephant 
 A       1      40        7      0.6
 A       2      50        3      4.0
 A       3      51        4      8.6
 A       4       8        7      12.1
 A       5      12        8      13.0
 A       6      32        12     4.2
 B       1 
 B       2 
 B       3 [...]  

什么时候应该(本质上)看起来像这样:

House   Day   Mongoose   Fruit  Elephant 
 A       1      40        7      0.6
 A       2    
 A       3     
 A       4      
 A       5      
 A       6      32        12     4.2    [rest of A houses have no data]
 B       1 
 B       2      50        3      4.0 
 B       3   
 B       4      51        4      8.6
 B       5 
 B       6       8        7      12.1    [rest of B houses have no data]
 C       1    
 C       2      12        8      13.0

请指教;我最终将不得不扩展这项技术来查看一个包含 198K 条目的样本数据集和一个包含 115K 条目的测试数据集。

谢谢!

【问题讨论】:

  • 你能举例说明Original 在你的例子中是什么样子吗?
  • 在上面发帖,以便我可以很好地格式化它
  • 将 ((sample$Day == original$Day) &amp;&amp; (sample$House == original$House)) 更改为 ((sample$Day[i] == original$Day[i]) &amp;&amp; (sample$House[i] == original$House[i])) 可能会起作用
  • @CactusWoman 我随后收到“需要 TRUE/FALSE 的缺失值”的错误

标签: r for-loop compare


【解决方案1】:

在我看来这样应该可行:

merge(sample, original, by = c("House", "Day"), all.x = TRUE)

但如果没有可重复的例子,很难说。您可能还想查看dplyr::left_join()。也就是说,假设您的数据如下所示:

sample <- data.frame(House = rep(c("A", "B", "C"), each = 6),
                     Day = rep(1:6, 3))

# head(sample)
#   House Day
# 1     A   1
# 2     A   2
# 3     A   3
# 4     A   4
# 5     A   5
# 6     A   6

original <- data.frame(House = c("A", "A", "B", "B", "C"),
                       Day = c(1, 6, 2, 4, 2),
                       Mongoose = c(40, 32, 50, 51, 8),
                       Fruit = c(7, 12, 3, 4, 8),
                       Elephant = c(0.6, 4.2, 4.0, 8.6, 12.1))

# head(original)
#   House Day Mongoose Fruit Elephant
# 1     A   1       40     7      0.6
# 2     A   6       32    12      4.2
# 3     B   2       50     3      4.0
# 4     B   4       51     4      8.6
# 5     C   2        8     8     12.1

我们得到:

# head(merge(sample, original, by = c("House", "Day"), all.x = TRUE))
#   House Day Mongoose Fruit Elephant
# 1     A   1       40     7      0.6
# 2     A   2       NA    NA       NA
# 3     A   3       NA    NA       NA
# 4     A   4       NA    NA       NA
# 5     A   5       NA    NA       NA
# 6     A   6       32    12      4.2

【讨论】:

  • 非常感谢它有效!我只是似乎复制了所有列,所以我现在有了: House Day Mongoose.x Fruit.x Elephant.x Mongoose.y Fruit.y 所有有用的日期都在 House、Day 和 __.Y 列中。这不是什么大问题,我只是不明白我做了什么 Elephant.y
【解决方案2】:

这可能是一个小调整,看看这行你的原始代码:

if ((sample$Day == original$Day) && (sample$House == original$House)) 

看看能不能改成这样:

if ((sample$Day[i] == original$Day[i]) && (sample$House[i] == original$House[i]))

因为:

  • 您正在使用带有i 变量的for 循环,
  • 你用sample$Mongoose[i] &lt;- original$Mongoose[i]这样的行做得很好
  • 但在您的示例中,if 语句似乎实际上并未使用i 变量
  • 因此我们对其进行了修改以使用i,因此它将专门比较观察/行的sample$Day与观察/行的original$Day,sample$House与original$House也是如此

【讨论】:

  • 这里我得到了一个需要 TRUE/FALSE 的缺失值错误。我也认为这可能是有问题的,因为我认为它不会将 sample$day 或 sample$house 与原始文件中的所有条目进行比较。不就是看同一个索引位置的条目吧?
猜你喜欢
  • 2019-04-15
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 2020-07-03
  • 2022-11-10
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
相关资源
最近更新 更多