如何将一个数据帧的值与另一个数据帧中的值进行比较?

花林

我几天前发布了这个问题,但有人告诉我我的描述太混乱了。但是,在澄清了我的问题并添加了示例之后,该问题没有得到任何进一步的关注。由于我仍然需要一个解决方案,因此我删除了旧问题,现在将其发布为希望更好的表述形式。

以下示例说明了我的问题。

我有两个对象。首先是一个数据框,描述每个人的(id)组(group),s(he)采取行动的年份do.year)以及2010年至2010年之间每年的变量值(var)。 2015(var.year)。

set.seed(1)
df <- data.frame(
   id = rep(1:3, each = 6),
   group = c(rep("a", 12), rep("b", 6)),
   do.year = rep(sample(2011:2013), each = 6),
   var = runif(18),
   var.year = 2010:2015)
df
   id group do.year        var var.year
1   1     a    2011 0.90820779     2010
2   1     a    2011 0.20168193     2011
3   1     a    2011 0.89838968     2012
4   1     a    2011 0.94467527     2013
5   1     a    2011 0.66079779     2014
6   1     a    2011 0.62911404     2015
7   2     a    2013 0.06178627     2010
8   2     a    2013 0.20597457     2011
9   2     a    2013 0.17655675     2012
10  2     a    2013 0.68702285     2013
11  2     a    2013 0.38410372     2014
12  2     a    2013 0.76984142     2015
13  3     b    2012 0.49769924     2010
14  3     b    2012 0.71761851     2011
15  3     b    2012 0.99190609     2012
16  3     b    2012 0.38003518     2013
17  3     b    2012 0.77744522     2014
18  3     b    2012 0.93470523     2015

第二个对象由组ab的数据框组成,还包含2010年至2015年之间每年的变量(varvar.year),但这是组成员的平均值。它是数据帧的列表,但如有必要,也可以将其转换为单个数据帧。

avg <- list(
   "a" = data.frame(var.year = 2010:2015, var = runif(6)),
   "b" = data.frame(var.year = 2010:2015, var = runif(6)))
avg
$a
  var.year        var
1     2010 0.21214252
2     2011 0.65167377
3     2012 0.12555510
4     2013 0.26722067
5     2014 0.38611409
6     2015 0.01339033

$b
  var.year       var
1     2010 0.3823880
2     2011 0.8696908
3     2012 0.3403490
4     2013 0.4820801
5     2014 0.5995658
6     2015 0.4935413

我的目标是在特定年份(do.year中将每个人的结果指标与各个比较组的结果指标进行比较因此,对于每个个体(id),我想取采取行动的年份(do.year)中的变量(var的值,然后从该值中减去组平均值(varavg中)同年(var.year)。每个人的结果将存储在新变量diff.var中

我只有几周的R经验,所以我的解决方案是只合并每个组(和变量)的数据集,然后进行计算(如下)。但是,由于我的原始数据集涉及7个组和6个变量,因此将导致大约1000行代码。我也尝试了循环,但是无法在各处正确定义循环变量。

df.a <- merge(df, avg[["a"]], by = "var.year")
df.a$diff.var[df.a$group == "a" & df.a$var.year == df.a$do.year] <- 
    df.a$var.x[df.a$group == "a" & df.a$var.year == df.a$do.year] - 
    df.a$var.y[df.a$group == "a" & df.a$var.year == df.a$do.year]
df.a
   var.year id group do.year      var.x      var.y   diff.var
1      2010  1     a    2011 0.90820779 0.21214252         NA
2      2010  2     a    2013 0.06178627 0.21214252         NA
3      2010  3     b    2012 0.49769924 0.21214252         NA
4      2011  1     a    2011 0.20168193 0.65167377 -0.4499918
5      2011  2     a    2013 0.20597457 0.65167377         NA
6      2011  3     b    2012 0.71761851 0.65167377         NA
7      2012  1     a    2011 0.89838968 0.12555510         NA
8      2012  2     a    2013 0.17655675 0.12555510         NA
9      2012  3     b    2012 0.99190609 0.12555510         NA
10     2013  1     a    2011 0.94467527 0.26722067         NA
11     2013  2     a    2013 0.68702285 0.26722067  0.4198022
12     2013  3     b    2012 0.38003518 0.26722067         NA
13     2014  1     a    2011 0.66079779 0.38611409         NA
14     2014  2     a    2013 0.38410372 0.38611409         NA
15     2014  3     b    2012 0.77744522 0.38611409         NA
16     2015  1     a    2011 0.62911404 0.01339033         NA
17     2015  2     a    2013 0.76984142 0.01339033         NA
18     2015  3     b    2012 0.93470523 0.01339033         NA

df.b <- merge(df, avg[["b"]], by = "var.year")
df.b$diff.var[df.b$group == "b" & df.b$var.year == df.b$do.year] <- 
    df.b$var.x[df.b$group == "b" & df.b$var.year == df.b$do.year] - 
    df.b$var.y[df.b$group == "b" & df.b$var.year == df.b$do.year]
df.b
   var.year id group do.year      var.x     var.y  diff.var
1      2010  1     a    2011 0.90820779 0.3823880        NA
2      2010  2     a    2013 0.06178627 0.3823880        NA
3      2010  3     b    2012 0.49769924 0.3823880        NA
4      2011  1     a    2011 0.20168193 0.8696908        NA
5      2011  2     a    2013 0.20597457 0.8696908        NA
6      2011  3     b    2012 0.71761851 0.8696908        NA
7      2012  1     a    2011 0.89838968 0.3403490        NA
8      2012  2     a    2013 0.17655675 0.3403490        NA
9      2012  3     b    2012 0.99190609 0.3403490 0.6515571
10     2013  1     a    2011 0.94467527 0.4820801        NA
11     2013  2     a    2013 0.68702285 0.4820801        NA
12     2013  3     b    2012 0.38003518 0.4820801        NA
13     2014  1     a    2011 0.66079779 0.5995658        NA
14     2014  2     a    2013 0.38410372 0.5995658        NA
15     2014  3     b    2012 0.77744522 0.5995658        NA
16     2015  1     a    2011 0.62911404 0.4935413        NA
17     2015  2     a    2013 0.76984142 0.4935413        NA
18     2015  3     b    2012 0.93470523 0.4935413        NA

如何在R中解决此问题?基本R或data.table解决方案将是首选。

大卫·阿伦堡(David Arenburg)

如果您想要一种data.table解决方案,那么这里可能是一个解决方案。我建议先将您的列表转换为data.table带有group列的。而只是做一个连接上var.year,并group同时do.year == var.year创造diff.var的飞行。我还假设您不是真正在为每个组创建相同的数据集,而是avg根据您的规则仅将原始数据集加入其中类似于以下内容

library(data.table)
### Create a group column for each list and convert to a data.table
avg <- rbindlist(Map(cbind, avg, group = names(avg)))

### join by var.year and group while do.year == var.year and create diff.var on the fly
setDT(df)[do.year == var.year, 
          diff.var := var - avg[copy(.SD), var, on = c("var.year", "group")]]
df
#     id group do.year        var var.year   diff.var
#  1:  1     a    2011 0.90820779     2010         NA
#  2:  1     a    2011 0.20168193     2011 -0.4499918
#  3:  1     a    2011 0.89838968     2012         NA
#  4:  1     a    2011 0.94467527     2013         NA
#  5:  1     a    2011 0.66079779     2014         NA
#  6:  1     a    2011 0.62911404     2015         NA
#  7:  2     a    2013 0.06178627     2010         NA
#  8:  2     a    2013 0.20597457     2011         NA
#  9:  2     a    2013 0.17655675     2012         NA
# 10:  2     a    2013 0.68702285     2013  0.4198022
# 11:  2     a    2013 0.38410372     2014         NA
# 12:  2     a    2013 0.76984142     2015         NA
# 13:  3     b    2012 0.49769924     2010         NA
# 14:  3     b    2012 0.71761851     2011         NA
# 15:  3     b    2012 0.99190609     2012  0.6515571
# 16:  3     b    2012 0.38003518     2013         NA
# 17:  3     b    2012 0.77744522     2014         NA
# 18:  3     b    2012 0.93470523     2015         NA

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何用R中的另一个数据帧替换一个数据帧的某些值?

来自分类Dev

在R中,如何根据另一个数据帧中的范围对一个数据帧中的值进行分类?

来自分类Dev

根据将另一个单元格与另一个数据帧的单元格进行比较来更改一个数据帧中单元格的值-熊猫

来自分类Dev

将数据从一个数据帧复制到另一个数据帧,然后根据值替换数据

来自分类Dev

如何将行值保留到另一个数据帧的第n个行值

来自分类Dev

如何将一个数据帧中某些列的值与另一数据帧中同一列集的值进行比较?

来自分类Dev

Pyspark:基于一个列值从另一个数据帧中减去一个数据帧

来自分类Dev

如何将单元格值从一个数据帧复制到另一数据帧(不匹配的数据帧长度)

来自分类Dev

如何基于一个数据帧的行值是一个子字符串/包含在另一个数据帧的行值中来联接两个数据帧?

来自分类Dev

如何将一个数据帧中的一行的值与另一个数据帧中的多个行进行比较(包括计算)

来自分类Dev

根据R中的两个匹配条件,将值从一个数据帧添加到另一个数据帧

来自分类Dev

将一个熊猫数据帧合并到另一个熊猫数据帧,并从第二个数据帧中删除第一个数据帧中存在的值

来自分类Dev

在python熊猫中,如何合并两个数据帧,同时使用另一个的权重将值散布在一个数据中?

来自分类Dev

将值从一个数据帧替换为另一个

来自分类Dev

使用另一个数据帧查找数据帧的对应行值

来自分类Dev

根据另一个数据帧中的值将数据帧的列相乘

来自分类Dev

R-将一个数据帧中的值与另一个数据帧中的多个值进行匹配

来自分类Dev

遍历一个数据集,将值与另一个数据集进行比较

来自分类Dev

如何将数据帧列的所有元素与另一个数据帧中为该列指定的值相乘?

来自分类Dev

从 .csv 中获取最接近另一个数据帧中的值的值

来自分类Dev

如何将两个数据帧转换为另一个数据帧?

来自分类Dev

python - 如何将数据帧与python中pandas中另一个数据帧的子集交集进行比较?

来自分类Dev

将一个数据帧切片到另一个数据帧中

来自分类Dev

根据与另一个数据帧的比较更新数据帧值

来自分类Dev

仅将数据帧中的新值附加到 Pandas 中的另一个数据帧

来自分类Dev

合并数据帧,以便将一个数据帧中的值插入到另一个数据帧中匹配的行号中

来自分类Dev

如何将数据帧附加到另一个数据帧的每一行?

来自分类Dev

如何将一个数据帧作为子集(完整)查找或匹配到 R 中的另一个数据帧?

来自分类Dev

如何用除 NA 之外的另一个数据帧替换数据帧中的所有值?

Related 相关文章

  1. 1

    如何用R中的另一个数据帧替换一个数据帧的某些值?

  2. 2

    在R中,如何根据另一个数据帧中的范围对一个数据帧中的值进行分类?

  3. 3

    根据将另一个单元格与另一个数据帧的单元格进行比较来更改一个数据帧中单元格的值-熊猫

  4. 4

    将数据从一个数据帧复制到另一个数据帧,然后根据值替换数据

  5. 5

    如何将行值保留到另一个数据帧的第n个行值

  6. 6

    如何将一个数据帧中某些列的值与另一数据帧中同一列集的值进行比较?

  7. 7

    Pyspark:基于一个列值从另一个数据帧中减去一个数据帧

  8. 8

    如何将单元格值从一个数据帧复制到另一数据帧(不匹配的数据帧长度)

  9. 9

    如何基于一个数据帧的行值是一个子字符串/包含在另一个数据帧的行值中来联接两个数据帧?

  10. 10

    如何将一个数据帧中的一行的值与另一个数据帧中的多个行进行比较(包括计算)

  11. 11

    根据R中的两个匹配条件,将值从一个数据帧添加到另一个数据帧

  12. 12

    将一个熊猫数据帧合并到另一个熊猫数据帧,并从第二个数据帧中删除第一个数据帧中存在的值

  13. 13

    在python熊猫中,如何合并两个数据帧,同时使用另一个的权重将值散布在一个数据中?

  14. 14

    将值从一个数据帧替换为另一个

  15. 15

    使用另一个数据帧查找数据帧的对应行值

  16. 16

    根据另一个数据帧中的值将数据帧的列相乘

  17. 17

    R-将一个数据帧中的值与另一个数据帧中的多个值进行匹配

  18. 18

    遍历一个数据集,将值与另一个数据集进行比较

  19. 19

    如何将数据帧列的所有元素与另一个数据帧中为该列指定的值相乘?

  20. 20

    从 .csv 中获取最接近另一个数据帧中的值的值

  21. 21

    如何将两个数据帧转换为另一个数据帧?

  22. 22

    python - 如何将数据帧与python中pandas中另一个数据帧的子集交集进行比较?

  23. 23

    将一个数据帧切片到另一个数据帧中

  24. 24

    根据与另一个数据帧的比较更新数据帧值

  25. 25

    仅将数据帧中的新值附加到 Pandas 中的另一个数据帧

  26. 26

    合并数据帧,以便将一个数据帧中的值插入到另一个数据帧中匹配的行号中

  27. 27

    如何将数据帧附加到另一个数据帧的每一行?

  28. 28

    如何将一个数据帧作为子集(完整)查找或匹配到 R 中的另一个数据帧?

  29. 29

    如何用除 NA 之外的另一个数据帧替换数据帧中的所有值?

热门标签

归档