2016-01-20 2 views
1

Учитывая этот фрейм данныхЗаменить символ или строку в R

a   b 
1 --- rs149201999 
2 22 rs146752890 
3 --- rs139377059 
4 --- rs188945759 
5 22 rs6518357 
6 --- rs62224609 

df <- read.table(header = TRUE, stringsAsFactors = FALSE, 
text = "a   b 
1 --- rs149201999 
2 22 rs146752890 
3 --- rs139377059 
4 --- rs188945759 
5 22 rs6518357 
6 --- rs62224609") 

Я пытаюсь заменить «---» в ЦФ с «» (пусто) и «22» на «да» с выходом :

a   b 
1  rs149201999 
2 yes rs146752890 
3  rs139377059 
4  rs188945759 
5 yes rs6518357 
6  rs62224609 

Я бы очень признателен за любую помощь в этом вопросе.

+1

Если 'df $ a' состоит только из« --- »и« 22 », то я бы использовал' ifelse'. 'df $ a <- ifelse (df $ a ==" --- "," "," yes ")' Но это работает только в том случае, если это два значения. – brittenb

+3

'' Да '[+ (!! as.numeric (df $ a))] ' – rawr

+1

@rawr Я вижу, что вы там делали. –

ответ

2

Если это так просто, как вы описываете:

df$a <- ifelse(grepl("---", df$a), "", "yes") 
+2

Я предполагаю, что выход из программного обеспечения IMPUTE2, и он всегда '---', поэтому мы можем сделать просто 'ifelse (df $ a ==" --- "," "," yes ")'. – zx8754

0

использование sub(). Что-то вроде:

df$a <- sub("---", "", df$a) 
4

Вот подход с использованием таблицы поиска.

vec <- c(`---` = "", `22` = "yes") 
df$a <- vec[df$a] 
# a   b 
#1  rs149201999 
#2 yes rs146752890 
#3  rs139377059 
#4  rs188945759 
#5 yes rs6518357 
#6  rs62224609 
+0

Как бы вы распространили это на другие хромосомы? – zx8754

+1

@ zx8754 Я не уверен, что полностью понимаю вопрос. Получается, что вы спрашиваете: 'vec <- c (\' --- \ '=" ", rep (" yes ", 23)); имена (vec) [- 1] <- 1:23; df $ a <- vec [df $ a] '(предполагая 23 хромосомы)? – Jota

+0

Да, это именно то, что я имел в виду :), спасибо. – zx8754

Смежные вопросы