我的重新编码尝试
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
答案 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)))
)
其次,列名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"