【问题标题】:R: Identify non-NA values from one column and create dataframe with values from another column based rows selectedR:识别一列中的非 NA 值并创建数据框,其中选择了另一列基于行的值
【发布时间】:2021-07-25 12:27:35
【问题描述】:

我有一个包含多列 (45) 和多行 (20,000) 的数据框 (df):

我想过滤每个变量列,方法是只选择具有非 NA 值的行,并为所选行创建一个具有相应 ID 和名称的单独数据框。然后我想用相应的变量名保存每个数据框。例如,输出数据帧如下所示,分别保存为 Var1 和 Var2。

变量 1

变量 2

我目前正在尝试在 R 上使用这个函数并考虑实现一个 for 循环。

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

这不是很好,因为它没有列出相应 ID 和 Name 列中的值。这也不会创建数据框。

任何建议将不胜感激!

【问题讨论】:

标签: r function dataframe dplyr na


【解决方案1】:

下面是使用dplyr & purrr 的方法

请注意,下次不要发布您的数据图像,而是尝试在 R 中创建示例数据并复制粘贴该示例数据的 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())

reprex package (v2.0.0) 于 2021 年 5 月 3 日创建

【讨论】:

    【解决方案2】:

    你可以像这样使用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))
    

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 2020-05-18
      • 2021-12-29
      相关资源
      最近更新 更多