Создание нового столбца, который помечает строку в зависимости от условий - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь отфильтровать этот фрейм данных с именем df

structure(list(ï..ID = structure(c(2L, 1L, 4L, 6L, 3L, 7L, 5L, 
8L), .Label = c("Jay ", "Jim", "Jim ", "John ", "Mike ", "Peter", 
"Peter ", "Tom"), class = "factor"), Target1 = structure(c(8L, 
4L, 6L, 5L, 2L, 1L, 3L, 7L), .Label = c("Andreas", "Cheyne", 
"Frank", "John", "Mickey", "Raj", "Sarah", "Timothy"), class = "factor"), 
    Target2 = structure(c(4L, 3L, 1L, 5L, 2L, 1L, 1L, 1L), .Label = c("", 
    "Jake", "Peter", "Timothy ", "Tommy "), class = "factor"), 
    Parter1 = structure(c(3L, 2L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", 
    "Mike ", "Timothy"), class = "factor"), Parter2 = structure(c(1L, 
    2L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", "Peter"), class = "factor")), class = "data.frame", row.names = c(NA, 
-8L))

Я пытаюсь отфильтровать фрейм данных так, чтобы, если имена, которые появляются в этом векторе x

x=c("Raj", "Timothy")

появляется более 2 раз в столбцах 2-5, в строке будет переменная для совершенно нового столбца с именем flag, где flag = 1, если имя появляется более 2 раз, и flag = 0, если имя непоявляются более 2 раз.

1 Ответ

0 голосов
/ 31 января 2019

В Base R мы могли бы использовать apply с MARGIN = 1 (по строкам)

df$flag <- as.integer(apply(df, 1, function(row) sum(row %in% x)) > 2)

df
#  ï..ID Target1 Target2 Parter1 Parter2 flag
#1   Jim Timothy Timothy Timothy            1
#2   Jay    John   Peter    Mike   Peter    0
#3  John     Raj                            0
#4 Peter  Mickey   Tommy                    0
#5   Jim  Cheyne    Jake                    0
#6 Peter Andreas                            0
#7  Mike   Frank                            0
#8   Tom   Sarah                            0

apply преобразует кадр данных в матрицу и может быть медленным некоторое время.Вы можете избежать apply вызова, используя sapply с той же логикой

df$flag <- as.integer(sapply(1:nrow(df), function(i) sum(df[i, ] %in% x)) > 2)

И еще один способ написать это

df$flag <- as.integer(colSums(sapply(1:nrow(df), function(i) df[i, ] %in% x)) > 2)

PS - у вас были пробелы в именах,Сначала я должен был запустить

df[] <- lapply(df, trimws)

, чтобы удалить их.

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