Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:按功能内的索引参考其他DF_R_Function_Indexing_Apply - Fatal编程技术网

R:按功能内的索引参考其他DF

R:按功能内的索引参考其他DF,r,function,indexing,apply,R,Function,Indexing,Apply,我有一个数据帧,其行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

我有一个数据帧,其行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:

>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
    用于查找正确的行
  • 将单元格值设置为
    索引
    ,以查找新值
这样,结果将是:

  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(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")

提前谢谢

这与您给出的输出不完全匹配,但似乎与您的描述匹配

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

id.match看一看合并或加入。谢谢Ryan,我的问题打错了,R总是对的;-),此外,此解决方案是否包括行ID?我使用的较大的DF跳过了一些ID,并且时间表有所有ID。是的,它使用DF的ID列来选择使用哪一行timetbl,如果这是你的意思的话。哦,对不起,我明白了!它非常适合我较小的表格,但在较大的版本(6306x681)中,我得到了错误:
as.matrix(x)[I]:下标超出范围。
时间表的维度为6306x59,相同的ID。可能您的一些
DF
条目对应于
timetbl
中不存在的行或列。非常感谢!它现在正在工作。添加时:
DFx[DFx==“NULL”]
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