2012-06-24 3 views
1

Я несколько значений в dataframe называемой «ценности»Заменить значение в Dataframe если попадают в другой dataframe

т.е.:

Sam Ned Ted Ann 
500 430 57 212 
410 265 69 341 
189 554 153 457 
236 311 590 271 
50 568 234 442 

И некоторый контроль качества флагов в отдельном dataframe «флагов»

Sam$F Ned$F Ted$F Ann$F 
1 1 1 0 
0 0 1 0 
0 0 1 0 
0 0 0 0 
0 0 1 0 

Я хотел бы заменить число в 'значениях' на NA, если эквивалентная запись во флагах равна 1, что приводит к следующим

Sam Ned Ted Ann 
NA NA NA 212 
410 265 NA 341 
189 554 NA 457 
236 311 590 271 
50 568 NA 442 

Этот вопрос очень похож на этот: Replacing certain values in data.frame in R

Какой была решена аккуратно с «Объединить таблицы» решения.

За исключением того, что у меня есть много столбцов данных для выполнения этого, а не только для одного. Однако я должен иметь возможность получить для меня то же самое решение «таблицы слияния».

Чтобы объединить 2 таблицы (и заменить 1s с NA Я использовал следующие

F2 <-Flags 
F2[F2 == "1"] <- "NA" 
# Create identical column names for values and F2 for matching 
samples <-colnames(Rvalues) 
colnames(F2) <-samples 
#Create an ID column for F2 and values 
F2$ID <- c(1,2,3,4,5) 
Rvalues$ID <- c(1,2,3,4,5) 
out2 <- merge(Rvalues, F2, by = c("ID"), all.x = TRUE) 

В результате out2 dataframe выглядит следующим образом:

ID Sam.x Ned.x Ted.x Ann.x Sam.y Ned.y Ted.y Ann.y 
1 1 500 430 57 212 NA NA NA 0 
2 2 410 265 69 341 0 0 NA 0 
3 3 189 554 153 457 0 0 NA 0 
4 4 236 311 590 271 0 0 0 0 
5 5 50 568 234 442 0 0 NA 0 

Так что я хотел бы использовать решение (по Chase) по ссылке выше, в пределах цикла для прохождения столбцов для каждого образца.

Я пробовал следующее:

for [i in samples] 
{ 
out3 <- transform(out2, [i]$new = ifelse(is.na([i].x), [i].y, [i].x), [i].x = NULL, [i].y = NULL)} 

Это не работает (сообщение об ошибке

"Error: unexpected '[' in: 
"{ 
out3 <- transform(out2, newdata = ifelse(is.na(["") 

Так что у меня что-то не так, без скобок [] также не работает.

Любые исправления значительно оценили, большое спасибо

ответ

1

Если ваши «ценности» и data.frames «флаги» имеют одинаковый размер и порядок столбцов

values[flags == 1] <- NA 
+0

Wow, что это так просто и очевидно, да, они в одном измерении и порядке. Спасибо. Это делает цикл совершенно ненужным. Если, например, порядки столбцов были разными, знаете ли вы, что цикл был близок? – jksl

+0

Если порядок столбцов будет отличаться в data.frames, тогда вы можете: 1) сортировать столбцы, чтобы получить одинаковый порядок в обоих файлах данных. 2) использовать некоторые из 'apply' семейных функций. Для циклов в R обычно довольно медленно, и лучше избегать их использования. – DrDom

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