您可能還需要考慮使用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"
非常感謝aix!問題確實是1:3;拼寫出來工作。 – dw006 2010-12-13 11:58:35
+1供參考。 – Marek 2010-12-13 14:05:30