我有一個資料集,df1其中的列從S_2018_p到S_2021_p我想用 0 替換 >= 10 的值。我希望像df2.
library(data.table)
df1 = data.table(
ID = c("a1", "a2", "a3", "a4", "a5", "a6", "a7"),
"string1" = c("x2", "g3", "n2", "m3", "2w", "ps2", "kg2"),
"S_2018_p" = c(3,5,11,3,9,22,6),
"S_2019_p" = c(3,5,6,21,1,4,0),
"S_2020_p" = c(0,4,13,9,16,7,9),
"S_2021_p" = c(4,0,3,8,5,4,6),
"string2" = c("si", "q2", "oq", "mx", "ix", "p2", "2q"))
ID string1 S_2018_p S_2019_p S_2020_p S_2021_p string2
1: a1 x2 3 3 0 4 si
2: a2 g3 5 5 4 0 q2
3: a3 n2 11 6 13 3 oq
4: a4 m3 3 21 9 8 mx
5: a5 2w 9 1 16 5 ix
6: a6 ps2 22 4 7 4 p2
7: a7 kg2 6 0 9 6 2q
df2 = data.table(
ID = c("a1", "a2", "a3", "a4", "a5", "a6", "a7"),
"string1" = c("x2", "g3", "n2", "m3", "2w", "ps2", "kg2"),
"S_2018_p" = c(3,5,0,3,9,0,6),
"S_2019_p" = c(3,5,6,0,1,4,0),
"S_2020_p" = c(0,4,0,9,0,7,9),
"S_2021_p" = c(4,0,3,8,5,4,6),
"string2" = c("si", "q2", "oq", "mx", "ix", "p2", "2q"))
ID string1 S_2018_p S_2019_p S_2020_p S_2021_p string2
1: a1 x2 3 3 0 4 si
2: a2 g3 5 5 4 0 q2
3: a3 n2 0 6 0 3 oq
4: a4 m3 3 0 9 8 mx
5: a5 2w 9 1 0 5 ix
6: a6 ps2 0 4 7 4 p2
7: a7 kg2 6 0 9 6 2q
我試圖用 mutete_if 來做,但我沒有得到想要的輸出。
df1 %>%
mutate_if(is.numeric, ~1 * (. >= 10))
uj5u.com熱心網友回復:
Dplyr(使用最新版本)有一個很好的“across()”函式可以與 mutate 一起使用。請務必更新您的 dplyr 軟體包,因為它是最近的
library(dplyr)
df1 %>% mutate(across(where(is.numeric), function(x) ifelse(x >= 10, 0, x)))
ID string1 S_2018_p S_2019_p S_2020_p S_2021_p string2
1: a1 x2 3 3 0 4 si
2: a2 g3 5 5 4 0 q2
3: a3 n2 0 6 0 3 oq
4: a4 m3 3 0 9 8 mx
5: a5 2w 9 1 0 5 ix
6: a6 ps2 0 4 7 4 p2
7: a7 kg2 6 0 9 6 2q
uj5u.com熱心網友回復:
您可以在感興趣的特定列上使用apply和ifelse函式。例如:
apply(df1[,c(3,4,5,6)], MARGIN = c(1,2), FUN = function(x) ifelse(x >= 10, 0, x))
該apply函式將在資料框 ( df1[,c(3,4,5,6)])的選定行上作業,并將FUN = ifelse(x >= 10, 0, x)在每個資料幀的單元格 ( MARGIN = c(1,2))。
您當然可以然后用更正的部分替換資料幀部分:
df1[,c(3,4,5,6)] <- apply(df1[,c(3,4,5,6)], MARGIN = c(1,2), FUN = function(x) ifelse(x >= 10, 0, x))
uj5u.com熱心網友回復:
另一種解決方案,基于dplyr:
library(tidyverse)
library(data.table)
df1 = data.table(
ID = c("a1", "a2", "a3", "a4", "a5", "a6", "a7"),
"string1" = c("x2", "g3", "n2", "m3", "2w", "ps2", "kg2"),
"S_2018_p" = c(3,5,11,3,9,22,6),
"S_2019_p" = c(3,5,6,21,1,4,0),
"S_2020_p" = c(0,4,13,9,16,7,9),
"S_2021_p" = c(4,0,3,8,5,4,6),
"string2" = c("si", "q2", "oq", "mx", "ix", "p2", "2q"))
df1 %>%
mutate(
across(
where(is.numeric),
~ if_else(get(cur_column()) > 10, 0, get(cur_column()))))
#> ID string1 S_2018_p S_2019_p S_2020_p S_2021_p string2
#> 1: a1 x2 3 3 0 4 si
#> 2: a2 g3 5 5 4 0 q2
#> 3: a3 n2 0 6 0 3 oq
#> 4: a4 m3 3 0 9 8 mx
#> 5: a5 2w 9 1 0 5 ix
#> 6: a6 ps2 0 4 7 4 p2
#> 7: a7 kg2 6 0 9 6 2q
還有一個解決方案,基于purrr::map_if:
library(tidyverse)
library(data.table)
df1 = data.table(
ID = c("a1", "a2", "a3", "a4", "a5", "a6", "a7"),
"string1" = c("x2", "g3", "n2", "m3", "2w", "ps2", "kg2"),
"S_2018_p" = c(3,5,11,3,9,22,6),
"S_2019_p" = c(3,5,6,21,1,4,0),
"S_2020_p" = c(0,4,13,9,16,7,9),
"S_2021_p" = c(4,0,3,8,5,4,6),
"string2" = c("si", "q2", "oq", "mx", "ix", "p2", "2q"))
df1 %>% map_if(is.numeric, ~ ifelse(.x > 10 , 0, .x)) %>% as.data.table
#> ID string1 S_2018_p S_2019_p S_2020_p S_2021_p string2
#> 1: a1 x2 3 3 0 4 si
#> 2: a2 g3 5 5 4 0 q2
#> 3: a3 n2 0 6 0 3 oq
#> 4: a4 m3 3 0 9 8 mx
#> 5: a5 2w 9 1 0 5 ix
#> 6: a6 ps2 0 4 7 4 p2
#> 7: a7 kg2 6 0 9 6 2q
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/360279.html
