我想知道,對于以下問題是否有更直接的解決方案。我想通過符號和與分類列相關的條件來分隔數字列中的值。
如果這是我的資料框:
library(tidyverse)
a <- tribble(
~category , ~val ,
'A' , 1 ,
'A' , -1 ,
'B' , -2 ,
'C' , 1 ,
'Z' , 3 ,
'Z' , -4
)
我想創建四個具有正值和負值的新列,如果類別!= 'Z',如果類別 == 'Z',則為正值和負值。
此代碼產生所需的結果:
a %>%
mutate(good = if_else(category != 'Z' & val >= 0 , val , 0) ,
bad = if_else(category != 'Z' & val < 0 , val , 0) ,
reserve = if_else(category == 'Z' & val >= 0 , val , 0) ,
risk = if_else(category == 'Z' & val < 0 , val , 0))
但由于我有許多類別和值列以及許多將它們分開的規則,我最終會遇到大量的 if-else-conditions。那么,有人知道更直接的解決方案嗎?
uj5u.com熱心網友回復:
與上一個答案類似的想法。按條件劃分類別,然后擴大范圍。在這里,我向您展示如何使用轉換為數字索引的邏輯陳述句來索引類別。
library(tidyverse)
a |>
mutate(grp = c("bad", "good", "risk", "reserve")[
(val>0) (category == "Z") (val<0 & category == "Z") (val>0 & category == "Z") 1
],
id = row_number()) |>
pivot_wider(names_from = grp, values_from = val, values_fill = 0) |>
select(-id)
#> # A tibble: 6 x 5
#> category good bad reserve risk
#> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 A 1 0 0 0
#> 2 A 0 -1 0 0
#> 3 B 0 -2 0 0
#> 4 C 1 0 0 0
#> 5 Z 0 0 3 0
#> 6 Z 0 0 0 -4
uj5u.com熱心網友回復:
如果您可以放棄列,我會選擇這樣的東西val:
library(tidyverse)
a <- tribble(
~category , ~val ,
'A' , 1 ,
'A' , -1 ,
'B' , -2 ,
'C' , 1 ,
'Z' , 3 ,
'Z' , -4
)
a2 <- a %>%
mutate(
condition = case_when(
category != 'Z' & val >= 0 ~ 'good',
category != 'Z' & val < 0 ~ 'bad',
category == 'Z' & val >= 0 ~ 'reserve',
category == 'Z' & val < 0 ~'risk'
)
)
a2 %>%
rownames_to_column(".flag.row") %>%
pivot_wider(
names_from = 'condition',
values_from = 'val',
values_fill = 0
) %>%
select(-.flag.row)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/532170.html
標籤:r
上一篇:繪制未來幾年的預測
下一篇:如何解碼R資料框列
