цикл или функция для сравнения двух значений столбца и создания новой переменной в R - PullRequest
1 голос
/ 04 января 2012

У меня есть два больших и малых кадра данных (на самом деле набор данных очень, очень большой!).Следующее только для работы.

big  <- data.frame (SN = 1:5, names = c("A", "B", "C", "D", "E"), var = 51:55)

 SN names var
1  1     A  51
2  2     B  52
3  3     C  53
4  4     D  54
5  5     E  55

small <- data.frame (names = c("A", "C", "E"), type = c("New", "Old", "Old") )
  names type
1     A  New
2     C  Old
3     E  Old

Теперь мне нужно создать и новую переменную в "большой" с помощью переменной "тип" в маленькой.Имена в маленьком и большом совпадут, и соответствующий тип будет сохранен в столбце.Если нет совпадения между столбцами имен, это приведет к новому значению «unknown».Ожидаемый результат выглядит следующим образом:

resultdf <- data.frame(SN = 1:5, names = c("A", "B", "C", "D", "E"), var = 51:55, 
              type = c("New","Unknown", "Old", "Unknown", "Old"))

resultdf 
  SN names var    type
1  1     A  51     New
2  2     B  52 Unknown
3  3     C  53     Old
4  4     D  54 Unknown
5  5     E  55     Old

Я знаю, что это простой вопрос для экспертов, но я не мог понять это.

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Сначала используйте merge() с аргументом all=TRUE, чтобы объединить два data.frames, сохраняя строки big, которые не нашли соответствующего значения в small$names.Затем замените те элементы big$type, которые не нашли совпадения (отмеченные merge() на "NA"), строкой "Неизвестно" .

Обратите внимание, что, посколькуbig и small имеют только одно общее имя столбца, этот столбец по умолчанию используется для выполнения слияния.Для большего контроля над тем, какие столбцы используются в качестве основы для слияния, см. Аргументы by , by.x и by.y аргументы.

small <- data.frame (names = c("A", "C", "E"), 
                     type = c("New", "Old", "Old"), stringsAsFactors=FALSE)
big  <- data.frame (SN = 1:5, names = c("A", "B", "C", "D", "E"), var = 51:55,
                    stringsAsFactors=FALSE)

big <- merge(big, small, all=TRUE)
big$type[is.na(big$type)] <- "Unknown"
1 голос
/ 04 января 2012
big$type <- c(as.character(small$type),"Unknown") [
                                    match(
                                       x=big$names, 
                                       table=small$names, 
                                       nomatch=length(small$type)+1)]

Основная стратегия заключается в преобразовании коэффициента в символ, добавлении «неизвестного» значения, а затем с использованием больших имен $ для поиска правильного индекса «типов» в «маленьком» кадре данных.Генерация индексов является типичным использованием функции соответствия.

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