簡體   English   中英

如果任何行包含特定字符串,則從數據框中刪除列

[英]Remove columns from data frame if any row contains a specific string

我想刪除任何行中包含字符串--的列。

Number  138 139 140 141 143 144 147 148 149 150 151 152 14  15  N…  
nm4804  A   B   --  A   B   A   A   --  A   A   A   A   A   --  A  
nm7574  B   A   A   A   A   A   A   A   A   A   A   A   A   --  A
nm8723  B   --  B   B   B   --  A   --  B   B   B   B   --  --  A
N…      B   A   A   A   A   B   A   --  A   A   B   --  --  --  A

我想計算 -- 頻率,如果有任何列有超過 50% 的 -- 在列中,該列將被刪除。

期望的結果:

Number  138 140 141 143 147 149 150 151 N…  
nm4804  A   A   --    B A   A   A   A   A  
nm7574  B   A   A    A  A   A   A   A   A
nm8723  B   B   A    B  --    B  B  B   A
N…          B   A   A    A  A A A   B   A

數據(感謝 bgoldst)

df <- data.frame(Number=c('nm4804','nm7574','nm8723','N…'),`138`=c('A','B','B','B'),`139`=c(
'B','A','--','A'),`140`=c('--','A','B','A'),`141`=c('A','A','B','A'),`143`=c('B','A','B','A'
),`144`=c('A','A','--','B'),`147`=c('A','A','A','A'),`148`=c('--','A','--','--'),`149`=c('A',
'A','B','A'),`150`=c('A','A','B','A'),`151`=c('A','A','B','B'),`152`=c('A','A','B','--'),
`14`=c('A','A','--','--'),`15`=c('--','--','--','--'),`N…`=c('A','A','A','A'),check.names=F,
stringsAsFactors=F);

使用colSums()

df[,colSums(df=='--')==0]
##   Number 138 141 143 147 149 150 151 N…
## 1 nm4804   A   A   B   A   A   A   A  A
## 2 nm7574   B   A   A   A   A   A   A  A
## 3 nm8723   B   B   B   A   B   B   B  A
## 4     N…   B   A   A   A   A   A   B  A

我們也可以使用Filter

Filter(function(x) !any(x=="--"), df1)
#    Number X138 X141 X143 X147 X149 X150 X151 N…
#1 nm4804    A    A    B    A    A    A    A  A
#2 nm7574    B    A    A    A    A    A    A  A
#3 nm8723    B    B    B    A    B    B    B  A
#4     N…    B    A    A    A    A    A    B  A

如果我們需要刪除超過50%的列--

Filter(function(x) mean(x == '--') <= 0.5, df1)

注意:根據OP的示例,所有列都將保留在此處。

由於在問題中不清楚,我假設nm4804等行名稱, 138..152是列名,而不是實際數據。 有了它,我猜這是一個字符矩陣。 你的數據:

dat <- structure(c("A", "B", "B", "B", "B", "A", "--", "A", "--", "A", 
"B", "A", "A", "A", "B", "A", "B", "A", "B", "A", "A", "A", "--", 
"B", "A", "A", "A", "A", "--", "A", "--", "--", "A", "A", "B", 
"A", "A", "A", "B", "A", "A", "A", "B", "B", "A", "A", "B", "--", 
"A", "A", "--", "--", "--", "--", "--", "--", "A", "A", "A", 
"A"), .Dim = c(4L, 15L), .Dimnames = list(c("nm4804", "nm7574", 
"nm8723", "N..."), c("138", "139", "140", "141", "142", "143", 
"144", "145", "146", "147", "148", "149", "150", "151", "152"
)))

嘗試這個:

dat[,! apply(dat, 2, `%in%`, x = "--")]
#        138 141 142 144 146 147 148 152
# nm4804 "A" "A" "B" "A" "A" "A" "A" "A"
# nm7574 "B" "A" "A" "A" "A" "A" "A" "A"
# nm8723 "B" "B" "B" "A" "B" "B" "B" "A"
# N...   "B" "A" "A" "A" "A" "A" "B" "A"

這是一個使用 dplyr 的提案,使用 @r2evans 提出的 'dat' dataframe

dat <- structure(c("A", "B", "B", "B", "B", "A", "--", "A", "--", "A", 
"B", "A", "A", "A", "B", "A", "B", "A", "B", "A", "A", "A", "--", 
"B", "A", "A", "A", "A", "--", "A", "--", "--", "A", "A", "B", 
"A", "A", "A", "B", "A", "A", "A", "B", "B", "A", "A", "B", "--", 
"A", "A", "--", "--", "--", "--", "--", "--", "A", "A", "A", 
"A"), .Dim = c(4L, 15L), .Dimnames = list(c("nm4804", "nm7574", 
"nm8723", "N..."), c("138", "139", "140", "141", "142", "143", 
"144", "145", "146", "147", "148", "149", "150", "151", "152"
)))

這使得能夠刪除包含超過 50% 的 '--' 的所有列

dat %>% 
as.data.frame() %>% 
select_if(~!(sum(.=="--") / length(.) > 0.5))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM