Я использовал dplyr для своих данных, чтобы создать подмножество данных:

dd <- data.frame(ID = c(700689L, 712607L, 712946L, 735907L, 735908L, 735910L, 735911L, 735912L, 735913L, 746929L, 747540L), 
`1` = c("eg", NA, NA, "eg", "eg", NA, NA, NA, NA, "eg", NA), 
`2` = c(NA, NA, NA, "sk", "lk", NA, NA, NA, NA, "eg", NA), 
`3` = c(NA, NA, NA, "sk", "lk", NA, NA, NA, NA, NA, NA), 
`4` = c(NA, NA, NA, "lk", "lk", NA, NA, NA, NA, NA, NA), 
`5` = c(NA, NA, NA, "lk", "lk", NA, NA, NA, NA, NA, NA), 
`6` = c(NA, NA, NA, "lk", "lk", NA, NA, NA, NA, NA, NA))

Теперь я хочу проверить каждый столбец, кроме ID, если он содержит определенные строки. В этом примере я хочу создать 1 столбец с «1» для каждого идентификатора, который содержит столбец с «eg» и «0» для остальных. Аналогично, еще один столбец, который сообщает мне, есть ли в других столбцах «sk» или «lk». После этого старые столбцы, кроме ID, могут быть удалены из data.frame

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

Если это можно решить в dplyr, это было бы прекрасно, но приветствуется любое рабочее решение.

Результат должен выглядеть так:

result <- data.frame(ID = c(700689L, 712607L, 712946L, 735907L, 735908L, 735910L, 735911L, 735912L, 735913L, 746929L, 747540L), 
with_eg = c(1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0), 
with_sk_or_lk = c(0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0))
0
Draic 23 Мар 2017 в 15:51

2 ответа

Лучший ответ

Из вашего описания вы хотите, чтобы один столбец проверял «eg», а другой - «lk» и «sk». Если это так, то будет работать следующий базовый метод R.

dfNew <- cbind(id=dd[1],
               eg=pmin(rowSums(dd[-1] == "eg", na.rm=TRUE), 1),
               other=pmin(rowSums(dd[-1] == "sk" | dd[-1] == "lk", na.rm=TRUE), 1))

Здесь наличие «eg» проверяется по всему data.frame (кроме столбца id) и возвращается логическая матрица, rowSums добавляет значения TRUE в строки, а na.rm удаляет NA, то pmin принимает минимум выходных данных rowSums и 1, так что любые элементы с 2 заменяются на 1, а любые значения с 0 сохраняются.

Эта же логика применяется к построению «другой» переменной, за исключением того, что наличие «lk» или «sk» проверяется в исходной логической матрице. Наконец, data.frame возвращает data.frame из 3 столбцов с желаемыми значениями.

Это возвращает

dfNew
       ID eg other
1  700689  1     0
2  712607  0     0
3  712946  0     0
4  735907  1     1
5  735908  1     1
6  735910  0     0
7  735911  0     0
8  735912  0     0
9  735913  0     0
10 746929  1     0
11 747540  0     0
1
lmo 23 Мар 2017 в 13:10

Вот, по общему признанию, хакерское решение dplyr / purrr. Учитывая, что ваши идентификаторы не выглядят так, как будто они когда-либо будут равны «например», «sk» или «lk», я не включил ничего, чтобы не искать столбец идентификаторов.

library(dplyr)
library(purrr)
dd %>% 
    split(.$ID) %>% 
    map_df(~ data_frame(
        ID = .x$ID, 
        eg = ifelse(any(.x == 'eg', na.rm = TRUE), 1, 0), 
        other = ifelse(any(.x == 'lk' | .x == 'sk', na.rm = TRUE), 1, 0)
    ))
0
lune 23 Мар 2017 в 13:30