Копирование данных в R-кадре данных из одной ячейки в другую на основе содержимого другой ячейки - PullRequest
0 голосов
/ 25 апреля 2018

Вот пример кода, который поможет всем понять, что я пытаюсь сделать здесь:

ID  PicName  Rating  Correct
1   flower   4       
1   Answer           1
2   cat      5       
2   Answer           1

Я пытаюсь связать строки «Ответ» с соответствующими данными в строкенад ними, затем удалите эти строки «Ответить».Итак, мне нужно содержимое столбца «Правильно» в строках «Ответ», перемещенных в ячейку в том же столбце предыдущей строки.Мой инстинкт этой проблемы изначально заключался в том, чтобы попытаться проиндексировать эти строки ответов и выполнить поиск по фрейму данных таким образом, но я не уверен, как реализовать команду для извлечения данных из этих конкретных ячеек и перемещения их в другие конкретные ячейки.Любое понимание этой проблемы будет высоко оценено, спасибо!

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

@ Подход Рену великолепен, однако я предпочитаю dplyr / tidyverse:

df %>%
  group_by(ID) %>%
  summarise(
    PicName = first(PicName),
    Rating = first(Rating),
    Correct = nth(Correct, 2))

Returns:

# A tibble: 2 x 4
     ID PicName Rating Correct
  <int> <fct>    <int>   <int>
1     1 flower       4       1
2     2 cat          5       1

Хотя в целом то же самое.

0 голосов
/ 25 апреля 2018

Используя пакет data.table, вы можете пройти через каждый ID, выбрать первое значение PicName и Rating и второе значение Correct.

library(data.table)
setDT(df) # give df class "data.table"
df[, .( PicName = PicName[1] 
      , Rating  = Rating[1]
      , Correct = Correct[2])
   , by = ID]

Возвращает

   ID PicName Rating Correct
1:  1  flower      4       1
2:  2     cat      5       1

Другой вариант - merge Строки ответа с другими (дает тот же результат)

setkey(df, ID)
merge(df[PicName != 'Answer', -'Correct']
      , df[PicName == 'Answer', .(ID, Correct)])

Используемые данные:

df <- fread( 
"ID  PicName  Rating  Correct
1   flower   4       NA
1   Answer   NA        1
2   cat      5       NA
2   Answer  NA         1")

===================

Если у вас более одной пары на группу ID, вы можете использовать приведенный ниже код. При этом выбираются строки, где PicName == 'Answer' равен FALSE, используются эти строки для столбцов PicName и Rating, а затем используются другие строки для столбца Correct.

library(data.table)
library(magrittr)
setDT(df) # give df class "data.table"

df[, (PicName == 'Answer') 
      %>% {.(PicName  = PicName[!.]
            , Rating  = Rating[!.]
            , Correct = Correct[.])}
   , by = ID]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...