簡體   English   中英

在數據框上使用應用來填充另一個數據框的缺失值

[英]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_matchedtarget_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM