我有一個看起來像這樣的資料框
sl_no A_1 A_2 A_3 A_4 A_5 A_6
1 0 0 1 0 1 1
2 1 0 0 1 0 1
3 1 1 0 0 0 0
等等大約300行。我想要做的是只保留每行中“A_”變數中的第一個“1”。所以最終的資料集應該是這樣的
sl_no A_1 A_2 A_3 A_4 A_5 A_6
1 0 0 1 0 0 0
2 1 0 0 0 0 0
3 1 0 0 0 0 0
我該怎么辦?for回圈中的if else陳述句?
uj5u.com熱心網友回復:
這是一個帶有自定義功能的基本 R 選項 -
keep_only_first_one <- function(x) {
#get the position of first 1
inds <- match(1, x)
#If the positions is not the last one,
#change all the values after 1st one to 0.
if(inds < length(x)) x[(inds 1):length(x)] <- 0
x
}
df[-1] <- t(apply(df[-1], 1, keep_only_first_one))
df
# sl_no A_1 A_2 A_3 A_4 A_5 A_6
#1 1 0 0 1 0 0 0
#2 2 1 0 0 0 0 0
#3 3 1 0 0 0 0 0
這假設您要將此函式應用于除第一個列(因此為 -1)之外的所有列。如果要根據名稱選擇列,可以使用 -
cols <- grep('^A_', names(df))
df[cols] <- t(apply(df[cols], 1, keep_only_first_one))
df
uj5u.com熱心網友回復:
另一種可能的解決方案:
df <- data.frame(
sl_no = c(1L, 2L, 3L),
A_1 = c(0L, 1L, 1L),
A_2 = c(0L, 0L, 1L),
A_3 = c(1L, 0L, 0L),
A_4 = c(0L, 1L, 0L),
A_5 = c(1L, 0L, 0L),
A_6 = c(1L, 1L, 0L)
)
df[-1] <-
t(apply(df[-1], 1, \(x) {y = which(x == 1); x[1:length(x) != min(y)] <- 0; x}))
df
#> sl_no A_1 A_2 A_3 A_4 A_5 A_6
#> 1 1 0 0 1 0 0 0
#> 2 2 1 0 0 0 0 0
#> 3 3 1 0 0 0 0 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/457690.html
上一篇:IF陳述句未按預期引發錯誤
下一篇:使用ifelse替換和洗掉重復行
