如果這個問題非常基礎,我必須提前道歉,因為我還是R的新手。我已經嘗試在stackoverflow上尋找類似的問題,但我仍然無法解決我所面臨的問題。
我目前正在處理一個大型的資料集X,我想做的事情非常簡單。我想把選定列(非連續列)中的所有 NAs 替換為 "no"。
我首先創建了一個變數,包括我想要修改的所有列。例如,如果我想修改名為"m"、"l "和 "h"的列中的NAs,我寫道:
modify < - c("m"。 "l","h")
for (i in 1。 length(modify))
列<-修改[/span>i]
X$column <- as. character(X$column) #X is my dataframe。
X$column %>% replace_na("no")
這個回圈只回傳了"m"列的輸出,這是我修改變數的第一個變數。然而,即使在回圈后生成了輸出,當我試圖檢查X$m時,我的原始資料集沒有任何變化。
我還嘗試創建一個函式,它與回圈非常相似。盡管沒有產生錯誤資訊,但由于我不知道回傳值應該是什么,所以它沒有作業。
為什么回圈不能應用于我的整個資料集,而回圈中的單個步驟卻能作業?
非常感謝您的幫助!
uj5u.com熱心網友回復:
這可能會有幫助,這也是這里的答案之一(但這里使用all_of()略有不同):
library(tidyverse)
df < - tibble(x = c(1。 2, NA)。 y = c("a"/span>。 NA, "b"))
df
#> # A tibble: 3 × 2
#> x y
#> <dbl> <chr>
#> 1 1 a
#> 2 2 <NA>
#> 3 NA b
修改< - c("x"。 "y")
df %>%
突變()
across(all_of(modify)。 ~replace_na(. x, 0))。
)
#> # A tibble: 3 × 2
#> x y
#> <dbl> <chr>
#> 1 1 a
#> 2 2 0
#> 3 0 b
創建于2021-09-22,由reprex軟體包(v2.0.1)
uj5u.com熱心網友回復:
這里有一個基本的R方法,修改來自@scrameri.
的資料。df <- data. frame(x = c(1。 2。 NA)。 y = c("a"/span>。 NA, "b")。 c = c(1。 NA, 5))
修改< - c('x'>。 'y')
df[modify][ is. na(df[/span>modify])] < - 'no'
df
# x y c
#1 1 a 1
#2 2 no NA
#3 no b 5
uj5u.com熱心網友回復:
我將用盡可能少的改動來修復你的代碼,這樣你就可以學習了。
這里有兩個大問題。
有兩個大問題。首先,for回圈需要在你想要回圈的行周圍加上大括號{}。 第二,如果你想動態地參考資料框中的變數,你不能使用$運算子。 你必須使用雙括號[[]].
library(tidyr)
X <- data. frame(m = c(1。 2。 NA)。 l = c("a"/span>, NA, "b")。 h = c(1。 NA, 5))
修改< - c("m"。 "l","h")
for (i in seq_along(modify)) {
列<- modify[i]
X[[column] <- 作為。 字符(X[[/span>column]]) #X是我的資料幀
X[[column]]/span> < - X[[column] %> % replace_na("no"/span>)
}
X
# m l h
# 1 1 a 1
# 2 2 no no # 2 2 no no
# 3 no b 5
你可以更有效地完成你想做的事情,正如其他答案中所示。 但我想告訴你如何按照你的方法來做,以糾正你對for回圈和子集運算子的理解。 這些都是每個人在剛開始學習R時應該了解的基本內容。
你可能想通過一個初學者教程來鞏固你的理解。 我在第一次學習時使用了tutorialspoint,發現它很有用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/332208.html
標籤:
