结合条件

时间:2010-12-13 11:17:04

标签: r

我的重新编码尝试

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 个答案:

答案 0 :(得分:5)

问题出在这一行:

df$1st==(1:3)

您可以使用%in%

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

警告来了,因为你比较不同长度的矢量(1:3长度为3 df$1st有长度“只有你知道什么”。

除此之外我认为您错过了您的值被覆盖:df$2nd <= 4也是df$2nd <= 6所以所有1和2都被3覆盖。

答案 1 :(得分:4)

我不确定您要使用df$1st==(1:3)尝试实现的目标,但它可能不符合您的想法。 c(1,2,3) df只需df$1st df$1st>=1 & df$1st<=3 即可。{/ 1}}。

如果您要检查{{1}}是否介于1和3之间,您可能需要拼写出来:

{{1}}

答案 2 :(得分:1)

您可能还想考虑使用transform()来处理重新编码等问题。 transform()执行速度比逻辑索引方法慢,但更容易消化代码的意图。可以找到关于不同方法的利弊的良好讨论here。考虑:

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)))
    )

其次,列名1st2nd不是语法上有效的列名。请查看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"