Сочетание условий - PullRequest
       1

Сочетание условий

3 голосов
/ 13 декабря 2010

мои попытки перекодирования

df$test[(df$1st==(1:3) & df$2nd <= 4)] <- 1
df$test[(df$1st==(1:3) & df$2nd <= 5)] <- 2
df$test[(df$1st==(1:3) & df$2nd <= 6)] <- 3

приводят к предупреждению "longer object length is not a multiple of shorter object length" и большому количеству NA с в df$test, хотя некоторые перекодировки работают правильно.
Чего мне не хватает?Любая помощь приветствуется.

DW

Ответы [ 3 ]

5 голосов
/ 13 декабря 2010

Проблема в этой строке:

df$1st==(1:3)

Вы можете использовать %in%

df$1st %in% (1:3)

Предупреждение приходит, потому что вы сравниваете векторы различной длины (1:3 имеет длину 3, а df$1st имеет длину "только вы знаете, что").

Кроме того, я думаю, вы пропустили, что ваши значения перезаписаны: df$2nd <= 4 также df$2nd <= 6, поэтому все 1 и 2 перезаписываются на 3.

4 голосов
/ 13 декабря 2010

Я не уверен, чего вы пытаетесь достичь с помощью df$1st==(1:3), но, вероятно, он не делает то, что вы думаете, что он делает.Он перерабатывает c(1,2,3) столько раз, сколько необходимо, чтобы сделать это, пока df.

Если вы пытаетесь проверить, является ли df$1stмежду 1 и 3, вы можете указать это:

df$1st>=1 & df$1st<=3
1 голос
/ 13 декабря 2010

Вы также можете рассмотреть возможность использования transform() для решения таких проблем перекодирования, как эта.transform() будет работать медленнее, чем метод логического индексирования, но его легче переварить суть кода.Хорошее обсуждение плюсов и минусов различных методов можно найти здесь .Обратите внимание:

set.seed(42)
df <- data.frame("first" = sample(1:5, 10e5, TRUE), "second" = sample(4:8, 10e5, TRUE))

df <- transform(df
    , test =      ifelse(first %in% 1:3 & second == 4, 1
            , ifelse(first %in% 1:3 & second == 5, 2
            , ifelse(first %in% 1:3 & second == 6, 3, NA)))
    )

Во-вторых, имена столбцов 1st и 2nd не являются синтаксически допустимыми именами столбцов.Посмотрите на make.names() для более подробной информации о том, что составляет допустимые имена столбцов.При работе с data.frame вы можете использовать / злоупотреблять аргументом check.names.Например:

> df <- data.frame("1st" = sample(1:5, 10e5, TRUE), "2nd" = sample(4:8, 10e5, TRUE), check.names = FALSE)
> colnames(df)
[1] "1st" "2nd"
> df <- data.frame("1st" = sample(1:5, 10e5, TRUE), "2nd" = sample(4:8, 10e5, TRUE), check.names = TRUE)
> colnames(df)
[1] "X1st" "X2nd"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...