![](/img/trans.png)
[英]Replace non-NA values in a Certain Column with Values From Another Column in R
[英]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。
任何建議將不勝感激!
這是使用dplyr
和purrr
完成的方法
請注意,下次不要發布您的數據圖像,而是嘗試在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.