R Как с оператором ifelse извлечь значение из другого столбца, если условие истинно?

Вероятно, для этого есть простое решение, но я всю ночь пытался получить это, и я не могу найти правильные условия поиска, чтобы найти ответ, поэтому я ценю любую помощь.

По сути, я заполняю новый кадр данных, ища имя строк в другом кадре данных2, и если это имя находится в кадре данных2, я хочу получить значение во втором столбце датаграммы2... и если это не так , то я хочу добавить ноль.

Вот код, который у меня есть.. но это случайные значения, если имя находится в dataframe2.

UTR3s.totes.df <- UTR3s.df
for (i in 1:317) {
  targets.df <- subset(TC_merge,V14==consmiRNAs[i])[,c(18,5)]
  targets <- intersect(targets.df$ENSEMBL, UTR3s$Gene)
  targets.df <- subset(targets.df, targets.df$ENSEMBL %in% targets)
  sitenumber = data.frame(Gene = UTR3s$Gene)
  UTR3s.totes.df[, paste("target",i,sep="")] <- ifelse(sitenumber$Gene %in% 
targets.df$ENSEMBL, targets.df$V5, "0")
}

Все работает, кроме последней строки... вытягивание соответствующего значения из dataframe2 (targets.df)

Добавлен воспроизводимый пример:

U.df <- data.frame(name=c("name1","name2","name3","name4","name5"))
targets.df <- data.frame(name=c("name1","name3","name5"),value=c(2,1,3))
U.df[, paste("target",i,sep="")] <- ifelse(U.df$name %in% targets.df$name, 
targets.df$value, "0")

person user2180513    schedule 13.09.2018    source источник
comment
comment
Не могли бы вы привести небольшой воспроизводимый пример? Вы также смотрели на match()?   -  person nghauran    schedule 13.09.2018
comment
Хорошо, вот пример: U.df <- data.frame(name=c("name1","name2","name3","name4","name5")) targets.df <- data.frame(name=c("name1","name3","name5"),value=c(2,1,3)) U.df[, paste("target",i,sep="")] <- ifelse(U.df$name %in% targets.df$name, targets.df$value, "0") Вы можете видеть, что правильные значения не соответствуют правильным именам. Есть ли способ исправить это?   -  person user2180513    schedule 13.09.2018
comment
@ANG match() дает мне номера строк, а не значения во втором столбце???   -  person user2180513    schedule 13.09.2018
comment
Я действительно могу использовать любую помощь. Большое спасибо.   -  person user2180513    schedule 13.09.2018
comment
Вы хотите использовать только оператор ifelse()?   -  person nghauran    schedule 13.09.2018


Ответы (1)


Вот 2 варианта, которые вы можете попробовать:

## data
U.df <- data.frame(name=c("name1","name2","name3","name4","name5"))
targets.df <- data.frame(name=c("name1","name3","name5"),value=c(2,1,3))

## option 1 (based on merging the data frames)
library(dplyr)
U.df2 <- left_join(U.df, targets.df, by = "name")
U.df2$value[is.na(U.df2$value)] <- 0 # set NA values to 0
U.df2 # output
   name value
1 name1     2
2 name2     0
3 name3     1
4 name4     0
5 name5     3

## option 2 (if you only want an ifelse statement)
U.df$value <- ifelse(U.df$name %in% targets.df$name,
                     targets.df$value[match(U.df$name, targets.df$name)],
                     0)
U.df # output
   name value
1 name1     2
2 name2     0
3 name3     1
4 name4     0
5 name5     3
person nghauran    schedule 13.09.2018