R: подмножество фрейма данных на основе списка значений в списке - PullRequest
0 голосов
/ 04 мая 2020

У меня есть фрейм данных с идентификаторами участников и наблюдениями. У меня также есть список идентификаторов некоторых участников, которых необходимо удалить из этого фрейма данных - я хочу удалить всю строку, связанную с этим идентификатором участника. Я пробовал следующее:

ListtoRemove <- as.list(ListtoRemove)
NewDataFrame <-    
subset(OldDataFrame,OldDataFrame$ParticipantsIDs!=ListtoRemove)

Это дает два предупреждения и не удаляет строки.

1: In `!=.default`(DemographicsALL$subject_label, AllSibs) :
longer object length is not a multiple of shorter object length
2: In is.na(e1) | is.na(e2) :
longer object length is not a multiple of shorter object length
> 

Пример данных:

structure(list(ParticipantsIDs = structure(c(2L, 1L, 3L, 4L, 
6L, 5L), .Label = c("B0002", "B001", "B003", "B004", "L004", 
"M003"), class = "factor"), Age = structure(c(3L, 1L, 4L, 2L, 
5L, 6L), .Label = c("15", "23", "45", "53", "65", "98"), class =      
"factor")), class = "data.frame", row.names = c(NA, 
-6L))

ListtoRemove <- as.list(B004,M003)

Спасибо!

Ответы [ 4 ]

1 голос
/ 04 мая 2020

Если вы используете фрейм данных, более простой способ сделать это:

# create data.frame
df <- data.frame(ParticipantsIDs = c("B001", "B0002", "B003", "B004", "M003", "L004"), 
                        Age = c("45", "15", "53", "23", "65", "98"))

# vector containing ids to remove
ids.remove <- c('B004','M003')

df

# subset df by rows where ParticipantsIDs are not found in ids.remove
subset(df, !(ParticipantsIDs %in% ids.remove))
1 голос
/ 04 мая 2020

Использование ваших данных (ListtoRemove слегка отредактирован - надеюсь, это правильно):

data=structure(c("B001", "B0002", "B003", "B004", "M003", "L004", 
"45", "15", "53", "23", "65", "98"), .Dim = c(6L, 2L), .Dimnames = list(
NULL, c("ParticipantsIDs", "Age")))
ListtoRemove <- list("B004","M003")

А как насчет:

data_subset=data[!data[,"ParticipantsIDs"] %in% unlist(ListtoRemove),]

Вывод:

> data_subset
     ParticipantsIDs Age 
[1,] "B001"          "45"
[2,] "B0002"         "15"
[3,] "B003"          "53"
[4,] "L004"          "98"
1 голос
/ 04 мая 2020
NewDataFrame[ !NewDataFrame[,1] %in% unlist(ListtoRemove), ]
#      ParticipantsIDs Age 
# [1,] "B001"          "45"
# [2,] "B0002"         "15"
# [3,] "B003"          "53"
# [4,] "L004"          "98"

Я думаю, что в предоставленном вами коде могут быть некоторые ошибки.

  1. Вы используете subset таким образом, чтобы предположить, что NewDataFrame - это data.frame, но вы дали нам matrix. Мой код работает в любом случае, но ваш subset выйдет из строя (иначе, чем вы показали).
  2. as.list(B004, M003), возможно, ошибочен до трех пунктов:

    • если это имена переменных, то их у нас нет;
    • если это строки, то мы видим

      as.list(B004, M003)
      # Error in as.list(B004, M003) : object 'B004' not found
      
    • as.list(1, 2, 3) only list - определяет первый аргумент, здесь 2 и 3 игнорируются (так что мы видели бы только "B004", а не M003; возможно, вы имели в виду list("B004", "M003") или c("B004", "M003")?

Вместо этого я использовал

ListtoRemove <- list("B004","M003")
0 голосов
/ 05 мая 2020

В итоге я использовал data_subset = data [! Data [, "ParticipantsIDs"]% в% unlist (ListtoRemove),], и это сработало. Спасибо всем за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...