我正在嘗試創建一組變數,如果值符合條件,則從另一列列中列印出非冗余值。
例如,我的資料庫看起來像這樣(但有更多列):
Var_1 Var_2 Var_3
C21 S066X0A S069X9A
I618 D06 I629
H2710 J1029 C71
S066X9D S066X9D I618
如果一個值以[S][0][6][4-6]or開頭,[I][6]那么我希望它們列印出來,前提是之前沒有列印過相同的值。所以輸出看起來像:
Var_1 Var_2 Var_3 Out_1 Out_2
C21 S066X0A S069X9A S066X0A
I618 D06 I629 I618 I629
H2710 J1029 C71
S066X9D S066X9D I618 S066X9D I618
uj5u.com熱心網友回復:
我冒昧地添加了第三個輸出列Out_3,以處理連續有 3 個未列印匹配項的情況
df <- textConnection('
Var_1,Var_2,Var_3
C21,S066X0A,S069X9A
I618,D06,I629
H2710,J1029,C71
S066X9D,S066X9D,I618
') |>
read.csv(header = TRUE)
df$Out_1 <- ''
df$Out_2 <- ''
df$Out_3 <- ''
lapply(seq_along(df), function(x) {
print(df[ x, ])
matches <- str_extract_all(df[ x, ], '^S06[4-6].*|^I6.*') |>
unlist() |>
na.omit() |>
as.character()
idx <- which((matches %in% c(df$Out_1, df$Out_2, df$Out_3)) == FALSE)
if (length(idx) > 0) {
matches <- matches[ idx ]
lapply(seq_along(matches), function(i) {
cn <- sprintf('Out_%s', i)
df[ x, cn ] <<- matches[ i ]
})
}
}) |> invisible()
print(df)
Var_1 Var_2 Var_3 Out_1 Out_2 Out_3
1 C21 S066X0A S069X9A S066X0A
2 I618 D06 I629 I618 I629
3 H2710 J1029 C71
4 S066X9D S066X9D I618 S066X9D S066X9D
uj5u.com熱心網友回復:
我認為這將更容易處理長格式,因為您可以避免回圈變數或需要處理不斷變化的資料結構以及寬格式中可能存在大量空單元格。
longdat <- data.frame(id=seq(nrow(dat)), values=unlist(dat), row.names=NULL)
longdat <- longdat[order(longdat$id),]
## id values
##1 1 C21
##5 1 S066X0A
##9 1 S069X9A
##2 2 I618
##6 2 D06
##10 2 I629
##3 3 H2710
##7 3 J1029
##11 3 C71
##4 4 S066X9D
##8 4 S066X9D
##12 4 I618
標記特定值或確定組中的唯一性也非常簡單:
longdat$flag <- grepl("S06[4-6]|I6", longdat$values)
unique(longdat[longdat$flag,])
## id values flag
##Var_21 1 S066X0A TRUE
##Var_12 2 I618 TRUE
##Var_32 2 I629 TRUE
##Var_14 4 S066X9D TRUE
##Var_34 4 I618 TRUE
在哪里dat:
dat <- read.table(text="Var_1 Var_2 Var_3
C21 S066X0A S069X9A
I618 D06 I629
H2710 J1029 C71
S066X9D S066X9D I618", header=TRUE)
uj5u.com熱心網友回復:
鑒于:
df <- data.frame(
Var_1 = c("C21", "I618", "H2710", "S066X9D"),
Var_2 = c("S066X0A", "D06", "J1029", "S066X9D"),
Var_3 = c("S069X9A", "I629", "C71", "I618")
)
s06_ptrn <- "S06[4-6]"
i6_ptrn <- "I6"
加載這些包:
library(dplyr)
library(magrittr)
library(purrr)
library(stringr)
現在遍歷每一行以洗掉重復值(按行)并洗掉不匹配的字串:
out <- pmap_dfr(
df,
~ {
values <- c(...)
x <- values %>%
extract(
!duplicated(.) &
(str_starts(., s06_ptrn) | str_starts(., i6_ptrn))
)
# `pmap_dfr` requires that all output vectors are the same length and named:
length(x) <- length(values)
names(x) <- paste0("Out_", seq(length(x)))
x
}
) %>%
# We run this to remove empty columns:
select(
where(~ !all(is.na(.x)))
)
并系結兩個資料框:
bind_cols(df, out)
#> Var_1 Var_2 Var_3 Out_1 Out_2
#> 1 C21 S066X0A S069X9A S066X0A <NA>
#> 2 I618 D06 I629 I618 I629
#> 3 H2710 J1029 C71 <NA> <NA>
#> 4 S066X9D S066X9D I618 S066X9D I618
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/530717.html
標籤:r数据框数据争吵
上一篇:如何標記資料框中的重復項?
