我正在嘗試使用回圈在現有資料框中創建一個新變數,該變數取決于回圈中包含的變數的值。這個邏輯對我來說很有意義,但我得到了意想不到的結果。
以如下資料框為例:
> df
var1 var2 var3 var4
1 0 1 0 1
2 1 0 0 1
3 1 1 0 1
4 0 0 1 0
5 0 1 1 0
如果 vars1-4 中的任何一個等于 1,我想創建一個等于 0 的新變數 (var5)。否則,我希望將此變數編碼為缺失值。我寫了以下回圈:
for (var in c("var1", "var2", "var3", "var4")) {
df$var5 <- ifelse(
df[, var] == 1, 0, NA
)
}
這個邏輯對我來說似乎很簡單,類似于 Stata 中的“foreach”回圈,但我的結果出乎意料:
> for (var in c("var1", "var2", "var3", "var4")) {
df$var5 <- ifelse(
df[, var] == 1, 0, NA
)
}
> df
var1 var2 var3 var4 var5
1 0 1 0 1 0
2 1 0 0 1 0
3 1 1 0 1 0
4 0 0 1 0 NA
5 0 1 1 0 NA
由于某種原因,回圈似乎只將條件陳述句應用于“var”的最后一個元素。觀察值 4 和 5 應該為 0,因為這些行在指定的變數串列中包含一個 1。
我確定我缺少一些簡單的東西,但是有人知道如何糾正嗎?
uj5u.com熱心網友回復:
在回圈的每一遍中,您都在覆寫上一遍的結果,因此var1
浪費var3
了。
根據您的邏輯,我建議rowSums
并進行測驗。你說的值var5
應該是 a 0
if any of var1:var4
are 1
,否則它應該是NA
,所以
df$var5 <- ifelse(rowSums(df == 1) > 0, 0, NA)
df
# var1 var2 var3 var4 var5
# 1 0 1 0 1 0
# 2 1 0 0 1 0
# 3 1 1 0 1 0
# 4 0 0 1 0 0
# 5 0 1 1 0 0
如果df
您不想在此邏輯中考慮其他列,那么我們可以改為
df$var5 <- ifelse(rowSums(subset(df, select = var1:var4) == 1) > 0, 0, NA)
如果您必須使用for
回圈(不鼓勵),那么您需要在邏輯中包含先前的結果。
df$var5 <- NA
for (V in c("var1", "var2", "var3", "var4")) {
df$var5 <- ifelse(!is.na(df$var5) | df[[V]] == 1, 0, NA)
}
df
# var1 var2 var3 var4 var5
# 1 0 1 0 1 0
# 2 1 0 0 1 0
# 3 1 1 0 1 0
# 4 0 0 1 0 0
# 5 0 1 1 0 0
uj5u.com熱心網友回復:
根據您的評論HERE,您可以通過以下方式解決您的問題:
df$var5 = NA
for(var in c("var1", "var2", "var3", "var4")) {
df[df[[var]]==1, "var5"] = 0
}
var1 var2 var3 var4 var5
1 0 1 0 1 0
2 1 0 0 1 0
3 1 1 0 1 0
4 0 0 1 0 0
5 0 1 1 0 0
uj5u.com熱心網友回復:
這里有另外兩個選項:
library(tidyverse)
#data used
df <- read_table("var1 var2 var3 var4
0 1 0 1
1 0 0 1
1 1 0 1
0 0 1 0
0 1 1 0")
#tidyverse
df |>
mutate(var5 = ` `(!if_any(var1:var4, \(x) x == 1)))
#> # A tibble: 5 x 5
#> var1 var2 var3 var4 var5
#> <dbl> <dbl> <dbl> <dbl> <int>
#> 1 0 1 0 1 0
#> 2 1 0 0 1 0
#> 3 1 1 0 1 0
#> 4 0 0 1 0 0
#> 5 0 1 1 0 0
#base
df$var5 <- apply(df[,1:4], c(1), \(x) ` `(!any(x == 1)))
df
#> # A tibble: 5 x 5
#> var1 var2 var3 var4 var5
#> <dbl> <dbl> <dbl> <dbl> <int>
#> 1 0 1 0 1 0
#> 2 1 0 0 1 0
#> 3 1 1 0 1 0
#> 4 0 0 1 0 0
#> 5 0 1 1 0 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/528601.html
上一篇:如何查找用戶輸入的分數大于80?
下一篇:僅使用一個回圈列印以下圖案