问题描述
首先,我想说我对R是个新手。这个问题令人沮丧,简直令人难以置信。我试过申请、申请和申请。所有这些都有错误。我迷路了。
我要做的是,如果记录没有时间(其中为NA),则从"结果"中提取时间,并将其放入"记录"中的时间中。
我已经在传统的for循环中做到了这一点,但它使代码难以阅读。我已经阅读了应用函数可以让这变得更容易。
Data Frame "Results"
ID Time(sec)
1 1.7169811
2 1.9999999
3 2.3555445
4 3.4444444
Data Frame "Records"
ID Time(sec) Date
1 NA 1/1/2018
2 1.9999999 1/1/2018
3 NA 1/1/2018
4 3.1111111 1/1/2018
Data Frame 'New' Records
ID Time(sec) Date
1 1.7169811 1/1/2018
2 1.9999999 1/1/2018
3 2.3555445 1/1/2018
4 3.1111111 1/1/2018
推荐答案
在这种情况下不需要使用Apply。基于某个谓词有条件地在两个值之间进行选择的模式是ifelse()
:
ifelse(predicate, value_a, value_b)
在本例中,您说还必须确保两个数据帧之间的值按ID匹配。在R中实现这一点的函数被适当地命名为match()
match(target_values, values_to_be_matched)
match
返回匹配values_to_be_matched
到target_values
的索引,如下使用:target_values[indices]
。
组合在一起:
inds <- match(records$ID, results$ID)
records$time <- ifelse(is.na(records$time), results$time[inds], records$time)
is.na()
这里是一个谓词,用于检查向量中每个值的值是否为NA。