我想删除任何行中包含字符串--
的列。
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);
答案 0 :(得分:6)
使用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
答案 1 :(得分:4)
我们也可以使用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的示例,所有列都将保留在此处。
答案 2 :(得分:1)
由于问题中不清楚,我假设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"