當使用 'reduce' 將串列組合到 'final_0' 時(參考下圖),如何改變新變數 'amount_from'?我的代碼顯示錯誤。謝謝!

library(tidyverse)
table_base <- data.frame(cat=c("a","b","c","d"))
table_a <- data.frame(cat=c("a","b"),
value=c(1,2))
table_b <- data.frame(cat=c("a","c","d"),
value=c(7,9,10))
final_0<- reduce(list(table_base,table_a,table_b),left_join,by='cat') %>%
mutate(amount=coalesce(!!!select(.,starts_with('value'))))
#下面的代碼顯示錯誤[沒有適用于“填充”的方法應用于“字符”類的物件]
final_0 %>% pivot_longer(-c('cat','amount')) %>%
mutate(value_from=if_else(amount==value,name,NULL)) %>%
group_by(cat) %>%
mutate(value_from=tidyr::fill(value_from,.direction = "downup"))
uj5u.com熱心網友回復:
運行?fill將顯示問題:
用法
fill(data, ..., .direction = c("down", "up", "downup", "updown"))
該函式需要一個資料框和一組要填充的列(從...)。在您的實作中,您在mutate()呼叫中使用了它。以下是解決問題的方法:
final_0 %>%
pivot_longer(-c('cat','amount')) %>%
mutate(value_from=if_else(amount==value,name,NULL)) %>%
group_by(cat) %>%
fill(value_from, .direction = "downup")
# A tibble: 8 x 5
# Groups: cat [4]
cat amount name value value_from
<chr> <dbl> <chr> <dbl> <chr>
1 a 1 value.x 1 value.x
2 a 1 value.y 7 value.x
3 b 2 value.x 2 value.x
4 b 2 value.y NA value.x
5 c 9 value.x NA value.y
6 c 9 value.y 9 value.y
7 d 10 value.x NA value.y
8 d 10 value.y 10 value.y
盡管這可行,但有一個解決方案可以避免不必要地NULL使用if_else()然后需要填充它們來創建值:
final_0 %>%
pivot_longer(-c("cat", "amount")) %>%
group_by(cat) %>%
mutate(value_from = na.omit(name[amount == value]))
# A tibble: 8 x 5
# Groups: cat [4]
cat amount name value value_from
<chr> <dbl> <chr> <dbl> <chr>
1 a 1 value.x 1 value.x
2 a 1 value.y 7 value.x
3 b 2 value.x 2 value.x
4 b 2 value.y NA value.x
5 c 9 value.x NA value.y
6 c 9 value.y 9 value.y
7 d 10 value.x NA value.y
8 d 10 value.y 10 value.y
關于此的一些重要說明:
- 我們只是根據
name您的if_else()條件進行過濾。然后我們申請,na.omit()因為value可能NA。 - 此代碼可以導致的不同值
value_from用于相同cat的情況下value.x和value.y都等于amount。由于您使用if_else(). 如果您只想value_from為每個 設定一個值cat,則應使用na.omit(name[amount == value])[[1]]上面代碼中的類似內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/404939.html
標籤:
