Применение формулы к каждой строке фрейма данных фреймов данных с использованием if else - PullRequest
0 голосов
/ 20 марта 2020

У меня есть фрейм данных фреймов данных, где 8-й столбец каждого фрейма данных является числом. Для каждой записи в этом столбце, для каждого фрейма данных я хочу использовать оператор if else, чтобы выяснить, больше ли число 0,5. Если оно больше 0,5, я хочу создать новый столбец, который содержит 1- (число). Если его меньше, чем .5, я хочу, чтобы новый столбец содержал копию оригинального номера.

Например

[[1]]

DTM 2287  2 16  G 0.187500  C 0.812500

DTM 2290  2 16  A 0.187500  C 0.812500

DTM 2291  2 16  C 0.812500  G 0.187500

DTM 2293  2 16  T 0.000000  C 1.000000

DTM 2305  2 16  G 0.000000  C 1.000000

Я бы хотел, чтобы вывод выглядел так:

[[1]]

DTM 2287  2 16  G 0.187500  C 0.812500 0.187500

DTM 2290  2 16  A 0.187500  C 0.812500 0.187500

DTM 2291  2 16  C 0.812500  G 0.187500 0.187500

DTM 2293  2 16  T 0.000000  C 1.000000 0

DTM 2305  2 16  G 0.000000  C 1.000000 0

Я пробовал это :

files.x<-lapply(file.list, function(y){
if (test[,8] > 0.5) {
  test$fold=(1-x[,8])
} else {test$fold=x[,8]}})

Но получите сообщение о том, что номер столбца неверен.

Я пытался протестировать его на одном фрейме данных, что работает, но она применяет функцию к каждой строке, а не к тем, где значение больше. 5

test2<-if (test[,8] > 0.5){test$fold=1-test[,8]} else {test$fold=test[,8]}

Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Мы можем использовать map с dplyr

library(purrr)
library(dplyr)
new_list <- map(file.list,  ~ 
                     .x %>%
                        mutate(fold = case_when(.[[8]] > 0.5 ~
                                   1 - .[[8]], 
                          TRUE ~ .[[8]]))
0 голосов
/ 20 марта 2020

Мы можем использовать lapply до l oop над списком и использовать ifelse, который векторизован по сравнению с if / else, который работает со скалярными значениями.

new_list <- lapply(file.list, function(y) 
                  {y$fold <- ifelse(y[,8] > 0.5,1-y[,8], y[,8]);y})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...