簡體   English   中英

一次更改多列的值——model.matrix()?

[英]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 == 1country == 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM