Как запустить цикл for с использованием фрейма данных и вывести новый фрейм данных - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь сгенерировать фрейм данных, который использует цикл for (возможно) в существующем фрейме данных для генерации информации и либо заменить, либо записать новый df

У меня очень большой фрейм данных,и я хочу создать новый фрейм данных, сравнивая все строки с одной ссылочной строкой в ​​фрейме данных.Новый фрейм данных будет просто сказать T (true), если ячейка соответствует той же ячейке столбца в ссылочной строке, или F (false), если это не так.

с учетом фрейма данных (df):

Name pos1 pos2 pos3 pos4
JU1  6    7    9    8
JU2  6    4    5    7
JU3  6    7    5    4
JU4  4    8    5    4

Я хочу использовать JU3 в качестве моей ссылочной строки для генерации нового df с теми же заголовками столбцов и строк, которые будут возвращать true (T) для всех ячеек в каждой строке, которые соответствуют контрольной строке и ложному (F), если это не так.

Ожидаемым результатом будет кадр данных (df2):

   Name pos1 pos2 pos3 pos4
   JU1  T    T    F    F 
   JU2  T    F    T    F
   JU3  T    T    T    T
   JU4  F    F    T    T

Я играл с циклами for с командами if-else, но я новичок в программировании, поэтому не очень далеко продвинулся.Я не совсем уверен, смогу ли я просто перезаписать существующий фрейм данных или имеет смысл написать новый файл или таблицу csv полностью.Я уверен, что это очень простая проблема, но любая помощь или направление очень ценится!

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

В base R мы извлекаем строку с условием, основанным на «Имя», копируем строку, чтобы сделать измерения одинаковыми с исходными данными, и проводим сравнение (==)

cbind(df[1], df[-1] == df[df$Name == "JU3", -1][rep(1, nrow(df)), ])
#   Name  pos1  pos2  pos3  pos4
#1  JU1  TRUE  TRUE FALSE FALSE
#2  JU2  TRUE FALSE  TRUE FALSE
#3  JU3  TRUE  TRUE  TRUE  TRUE
#4  JU4 FALSE FALSE  TRUE  TRUE

данные

df <- structure(list(Name = c("JU1", "JU2", "JU3", "JU4"), pos1 = c(6L, 
 6L, 6L, 4L), pos2 = c(7L, 4L, 7L, 8L), pos3 = c(9L, 5L, 5L, 5L
), pos4 = c(8L, 7L, 4L, 4L)), class = "data.frame", row.names = c(NA, 
 -4L))
0 голосов
/ 10 февраля 2019

Вот возможное решение:

ref1<-c(6,7,5,4)
cbind(Name=df$Name,as.data.frame(purrr::map2(df[,-1],ref1,function(x,y) x==y)))


Name  pos1  pos2  pos3  pos4
1  JU1  TRUE  TRUE FALSE FALSE
2  JU2  TRUE FALSE  TRUE FALSE
3  JU3  TRUE  TRUE  TRUE  TRUE
4  JU4 FALSE FALSE  TRUE  TRUE

"Автоматизация"

ref2<-as.vector(df[df$Name=="JU3",-1])
cbind(Name=df$Name,as.data.frame(purrr::map2(df[,-1],ref2,function(x,y) x==y)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...