我在名為choice_1 和choice_2 的列中有一個學生專案選擇的data.frame,但有些條目為0,這意味著他們沒有選擇第二個選項。
df<-data.frame(studentID=c(102,103,104), choice_1=c(699,500,750),choice_2=c(698,0,0))
我有一個包含所有可能選擇的 data.frame:
choices<-data.frame(choices=seq(600:800)).
我想根據 data.frame 中的任何值在choice_1 或choice_2 中填寫0 choices。
uj5u.com熱心網友回復:
這是你要找的嗎?
df[df == 0] <- sample(choices$choices, length(df[df == 0]))
uj5u.com熱心網友回復:
假設您希望為一列或多 choice_*列執行此操作,則:
set.seed(42)
df[,-1] <- lapply(df[,-1], function(z) {
z[z==0] <- sample(choices$choices, size = sum(z == 0), replace = TRUE)
z
})
df
# studentID choice_1 choice_2
# 1 102 699 698
# 2 103 500 49
# 3 104 750 65
在 dplyr-ese 中:
df %>%
mutate(
across(starts_with("choice_"),
~ if_else(. == 0, as.numeric(sample(choices$choices, size = n(), replace = TRUE)), .)
)
)
# studentID choice_1 choice_2
# 1 102 699 698
# 2 103 500 49
# 3 104 750 65
原因as.numeric是因為if_else嚴格執行類,而雖然choice_*是numeric,你choices$choices是integer,所以if_else抱怨。另一種方法是替換if_else為ifelse(并洗掉as.numeric),因為base::ifelse在這方面有點馬虎。
uj5u.com熱心網友回復:
我們可以使用across一個ifelse陳述句:
library(dplyr)
df %>%
mutate(across(starts_with("choice"), ~ifelse(.==0, sample(choices$choices), .)))
studentID choice_1 choice_2
1 102 699 698
2 103 500 48
3 104 750 179
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336895.html
