【问题标题】:R: refer to other DF by index within functionR:通过函数内的索引引用其他DF
【发布时间】:2019-04-08 02:23:14
【问题描述】:

我有一个数据框,其行 ID 和索引值的结构如下:

>DF
   ID asn bln gerp grn hgv hrn lwd mpl zwl
1  10   5   6    3   2  NA   4  NA  NA  NA
2  11  NA   3   NA  NA   4  NA  NA   5   6
3  12  NA  NA   NA  NA  NA  NA   4   3   2
4  13   3   2    5   6  NA   4  NA  NA  NA
5  14  NA  NA   NA  NA  NA  NA   2   3   4

还有一个时间表:

>timetbl
  ID   X1   X2   X3   X4   X5
1  10  900  910  920  930 1000
2  11  915  930 1000 1010 1020
3  12 1200 1230 1255   NA   NA
4  13 1640 1700 1710 1750 1800
5  14 2000 2100 2200   NA   NA

我需要一个函数来创建一个新的数据框,其中索引号被 timetbl DF 中的时间替换,方法是:

  • ID 寻找正确的行
  • 单元格值为index 以查找新值

这样的结果将是:

  ID  asn  bln gerp  grn  hgv  hrn  lwd  mpl  zwl
1  10  930 1000 910  900   NA  920   NA   NA   NA
2  11  915  930   NA   NA 1000   NA   NA 1010 1020
3  12   NA   NA   NA   NA   NA   NA 1255 1230 1200
4  13 1640 1700 1750 1800   NA 1710   NA   NA   NA
5  14   NA   NA   NA   NA   NA   NA 2000 2100 2200

我试图通过使用apply()paste()%>% 来获得结果,但都没有成功。

有什么建议吗?

一些数据自己试试:

DF:

 > dput(DF)
    structure(list(ID = c(10, 11, 12, 13, 14), asn = c(5L, NA, NA, 
3L, NA), bln = c(6L, 3L, NA, 2L, NA), gerp = c(3L, NA, NA, 5L, 
NA), grn = c(2L, NA, NA, 6L, NA), hgv = c(NA, 4L, NA, NA, NA), 
    hrn = c(4L, NA, NA, 4L, NA), lwd = c(NA, NA, 4L, NA, 2L), 
    mpl = c(NA, 5L, 3L, NA, 3L), zwl = c(NA, 6L, 2L, NA, 4L)), row.names = c(NA, 
-5L), class = "data.frame")

时间表:

    > dput(timetbl)
structure(list(ID = c(10, 11, 12, 13, 14), X1 = c(900L, 915L, 
1200L, 1640L, 2000L), X2 = c(910L, 930L, 1230L, 1700L, 2100L), 
    X3 = c(920L, 1000L, 1255L, 1710L, 2200L), X4 = c(930L, 1010L, 
    NA, 1750L, NA), X5 = c(1000L, 1020L, NA, 1800L, NA)), row.names = c(NA, 
-5L), class = "data.frame")

提前致谢!

【问题讨论】:

  • 看看合并或加入。

标签: r function indexing apply


【解决方案1】:

这与您提供的输出不完全匹配,但似乎与您的描述相符

id.match <- match(DF$ID, timetbl$ID) 

DF[-1] <- lapply(2:ncol(DF), function(x){
  timetbl[as.matrix(cbind(id.match, DF[x]))]
  })

DF
#   ID  asn  bln gerp  grn  hgv  hrn  lwd  mpl  zwl
# 1  1  930 1000  910  900   NA  920   NA   NA   NA
# 2  2   NA  930   NA   NA 1000   NA   NA 1010 1020
# 3  3   NA   NA   NA   NA   NA   NA 1255 1230 1200
# 4  4 1700 1640 1750 1800   NA 1710   NA   NA   NA
# 5  5   NA   NA   NA   NA   NA   NA 2000 2100 2200

【讨论】:

  • 谢谢瑞恩,我的问题打错了,R 永远是对的 ;-),此外,这个解决方案是否包含行 ID?我使用的较大的 DF 会跳过一些 ID,并且时间表包含所有 ID。
  • 是的,它使用 DF 的 ID 列来选择要使用的 timetbl 的哪一行,如果这就是你的意思。
  • 哦,对不起,我确实明白了!它非常适合我的小桌子,但在更大的版本(6306 x 681)中我得到错误:Error in as.matrix(x)[i] : subscript out of bounds. 时间表的尺寸为 6306 x 59,并且 ID 相同..
  • 可能您的某些DF 条目对应于timetbl 中不存在的行或列
  • 非常感谢伙计!它现在正在工作。添加时:DFx[DFx == "NULL"] &lt;- NA 我得到了想要的结果。
猜你喜欢
  • 2022-07-12
  • 2020-10-31
  • 2017-02-06
  • 1970-01-01
  • 2012-08-04
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
相关资源
最近更新 更多