[英]Changing values of many columns at once -- model.matrix()?
這是我目前擁有的結構的 dput() 。
structure(list(id = c(1, 1, 2, 4, 4), country = c("USA", "Japan", "Germany", "Germany", "USA"), USA = c(0, 0, 0, 0, 0), Germany = c(0, 0, 0, 0, 0), Japan = c(0, 0, 0, 0, 0)), class = "data.frame", row.names = c(NA, -5L))
我想編輯此數據框以獲得以下結果,以便將此方法應用於具有 100k+ 觀察值的數據集。 具體來說,我想使用來自( df$country
)的信息來描述分配給特定 ID 的國家(例如, id == 1
和country == Japan
),並使用相應的列名(例如,a名為“日本”的列)等於 1。請注意,ID 不是唯一的!
這就是我想要結束的:
structure(list(id = c(1, 1, 2, 4, 4), country = c("USA", "Japan", "Germany", "Germany", "USA"), USA = c(1, 1, 0, 1, 1), Germany = c(0, 0, 1, 1, 1), Japan = c(1, 1, 0, 0, 0)), class = "data.frame", row.names = c(NA, -5L))
下面的代碼給出了一個接近的結果:
df[levels(factor(df$country))] = model.matrix(~country - 1, df)
但最終給了我以下錯誤的結構:
structure(list(id = c(1, 1, 2, 4, 4), country = c("USA", "Japan",
"Germany", "Germany", "USA"), USA = c(1, 0, 0, 0, 1), Germany = c(0,
0, 1, 1, 0), Japan = c(0, 1, 0, 0, 0)), row.names = c(NA, -5L
), class = "data.frame")
如何編輯上述命令以產生我想要的結果? 我不能使用數據透視,因為實際上,我正在處理許多在“國家”列中具有不同值的數據集,一旦數據透視,將產生具有不統一的列/結構的數據集,這將阻礙以后的數據分析。
感謝您的任何幫助!
也許這有幫助
library(dplyr)
df %>%
mutate(across(USA:Japan, ~ +(country == cur_column()))) %>%
group_by(id) %>%
mutate(across(USA:Japan, max)) %>%
ungroup
-輸出
# A tibble: 5 × 5
id country USA Germany Japan
<dbl> <chr> <int> <int> <int>
1 1 USA 1 0 1
2 1 Japan 1 0 1
3 2 Germany 0 1 0
4 4 Germany 1 1 0
5 4 USA 1 1 0
或將model.matrix
修改為
m1 <- model.matrix(~country - 1, df)
m1[] <- ave(c(m1), df$id[row(m1)], col(m1), FUN = max)
您可以使用基礎R
re <- rle(df$id)
for(j in re$values){
y <- which(j == df$id)
df[y , match(df$country[y] , colnames(df))] <- 1
}
id country USA Germany Japan
1 1 USA 1 0 1
2 1 Japan 1 0 1
3 2 Germany 0 1 0
4 4 Germany 1 1 0
5 4 USA 1 1 0
您是否正在為您的封閉問題尋找這樣的解決方案(組合) CRAN R - 一次將值“1”分配給許多虛擬變量
@akrun 提供的解決方案在這里解決了這個問題。 但你可能會尋找這樣的東西:
library(dplyr)
df %>%
group_by(id) %>%
mutate(across(-country, ~case_when(country == cur_column() ~ 1))) %>%
fill(-country, .direction = "updown") %>%
mutate(across(-country, ~ifelse(is.na(.), 0, .))) %>%
ungroup()
id country USA Germany Japan
<dbl> <chr> <dbl> <dbl> <dbl>
1 1 USA 1 0 1
2 1 Japan 1 0 1
3 2 Germany 0 1 0
4 4 Germany 1 1 0
5 4 USA 1 1 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.