簡體   English   中英

R:識別一列中的非 NA 值並創建 dataframe 並選擇另一列中的值

[英]R: Identify non-NA values from one column and create dataframe with values from another column based rows selected

我有一個包含多列(45)和多行(20,000)的數據框(df):

我想通過僅選擇具有非 NA 值的行並為所選行創建一個具有相應 ID 和名稱的單獨數據框來過濾每個變量列。 然后我想用相應的變量名保存每個數據框。 例如,output 數據幀如下所示,將分別保存為 Var1 和 Var2。

變量 1 <

在此處輸入圖像描述

變量 2 <

在此處輸入圖像描述

我目前正在嘗試在 R 上使用此 function 並考慮實現 for 循環。

df2 = lapply(df, function(x) {x[.is.na(x)]})。

這效果不太好,因為它沒有列出相應 ID 和 Name 列中的值。 這也不會創建 dataframe。

任何建議將不勝感激!

這是使用dplyrpurrr完成的方法

請注意,下次不要發布您的數據圖像,而是嘗試在dput中創建示例數據,然后復制粘貼該示例數據的 dput。

library(purrr)
library(dplyr)

data <- tibble(ID = c("A", "B", "C"),
  Name = c("D", "E", "F"),
  Var1 = c(1, NA, 2),
  Var2 = c(2, 2, NA),
  Var4 = c(NA, NA, 4))

columns <- names(data)[grepl("^Var", names(data))]


extract_na_item <- function(column_name, df) {
  df %>%
    filter(!is.na(!!sym(column_name))) %>%
    select(ID, Name)
}
list_var_not_na <- map(columns, extract_na_item, df = data)
names(list_var_not_na) <- columns

這是結果

list_var_not_na
#> $Var1
#> # A tibble: 2 x 2
#>   ID    Name 
#>   <chr> <chr>
#> 1 A     D    
#> 2 C     F    
#> 
#> $Var2
#> # A tibble: 2 x 2
#>   ID    Name 
#>   <chr> <chr>
#> 1 A     D    
#> 2 B     E    
#> 
#> $Var4
#> # A tibble: 1 x 2
#>   ID    Name 
#>   <chr> <chr>
#> 1 C     F

如果您真的想在 OP 中提到的那樣在全局環境中分配變量,您可以執行以下操作(盡管我建議只使用列表來訪問數據)

list2env(list_var_not_na, envir = globalenv())

代表 package (v2.0.0) 於 2021 年 5 月 3 日創建

您可以像這樣使用lapply

cols <- grep('Var', names(df))
df2 <- lapply(df[cols], function(x) df[!is.na(x), -cols])
df2

#$Var1
#  ID Name
#1  A    D
#3  C    F

#$Var2
#  ID Name
#1  A    D
#2  B    E

#$Var4
#  ID Name
#3  C    F

數據

df <- structure(list(ID = c("A", "B", "C"), Name = c("D", "E", "F"), 
    Var1 = c(1, NA, 2), Var2 = c(2, 2, NA), Var4 = c(NA, NA, 
    4)), class = "data.frame", row.names = c(NA, -3L))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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