[英]Use apply on a dataframe to fill in missing values from another dataframe
首先我想說我是 R 的新手。這個問題令人難以置信地令人沮喪。 我試過應用、lapply 和 mapply。 都有錯誤。 我搞不清楚了。
我想要做的是從“結果”中取出時間並將其放在“記錄”中的時間,如果記錄沒有時間(它是 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。
受這個答案的啟發。
來自幫助:給定一組向量, coalesce()
在每個位置找到第一個非缺失值。 這是受 SQL COALESCE 函數的啟發,該函數對 NULL 執行相同的操作
library(tidyverse)
txt1 <- "ID Time(sec)
1 1.7169811
2 1.9999999
3 2.3555445
4 3.4444444"
txt2 <- "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"
df1 <- read.table(text = txt1, header = TRUE)
df2 <- read.table(text = txt2, header = TRUE)
df1 %>%
left_join(df2, by = "ID") %>%
mutate(Time.sec. = coalesce(Time.sec..x, Time.sec..y)) %>%
select(-Time.sec..x, -Time.sec..y)
#> ID Date Time.sec.
#> 1 1 1/1/2018 1.716981
#> 2 2 1/1/2018 2.000000
#> 3 3 1/1/2018 2.355545
#> 4 4 1/1/2018 3.444444
由 reprex 包 (v0.2.0) 創建於 2018-03-10。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.