我对transform
的行为感到好奇。我可能尝试创建一个新列作为字符而不是因素的两种方法:
x <- data.frame(Letters = LETTERS[1:3], Numbers = 1:3)
y <- transform(x, Alphanumeric = as.character(paste(Letters, Numbers)))
x$Alphanumeric = with(x, as.character(paste(Letters, Numbers)))
x
y
str(x$Alphanumeric)
str(y$Alphanumeric)
结果“看起来”相同:
> x
Letters Numbers Alphanumeric
1 A 1 A 1
2 B 2 B 2
3 C 3 C 3
> y
Letters Numbers Alphanumeric
1 A 1 A 1
2 B 2 B 2
3 C 3 C 3
但是看看里面,只有一个有效:
> str(x$Alphanumeric) # did convert to character
chr [1:3] "A 1" "B 2" "C 3"
> str(y$Alphanumeric) # but transform didn't
Factor w/ 3 levels "A 1","B 2","C 3": 1 2 3
我没有发现?transform
对解释这种行为非常有用 - 大概是Alphanumeric
被强制回成一个因素 - 或找到一种方法来阻止它(类似于stringsAsFactors = FALSE
data.frame
)。最安全的方法是什么?是否有类似的陷阱需要注意,例如使用apply
或plyr
函数?
答案 0 :(得分:3)
transform
和data.frame
的问题不同,stringsAsFactors
默认设置为TRUE
。FALSE
。添加一个应该是y <- transform(x, Alphanumeric = paste(Letters, Numbers),
stringsAsFactors = FALSE)
str(y)
# 'data.frame': 3 obs. of 3 variables:
# $ Letters : Factor w/ 3 levels "A","B","C": 1 2 3
# $ Numbers : int 1 2 3
# $ Alphanumeric: chr "A 1" "B 2" "C 3"
的参数,你就可以了:
within
我通常使用transform
代替y <- within(x, {
Alphanumeric = paste(Letters, Numbers)
})
str(y)
# 'data.frame': 3 obs. of 3 variables:
# $ Letters : Factor w/ 3 levels "A","B","C": 1 2 3
# $ Numbers : int 1 2 3
# $ Alphanumeric: chr "A 1" "B 2" "C 3"
,而且似乎没有这个问题:
with
这是因为它采用了类似于[<-
方法的方法:创建一个字符向量并将其(通过data.frame
)添加到现有transform.data.frame
。
您可以在提示符下键入within.data.frame
和apply
来查看每个来源。
至于其他陷阱,这个问题太宽泛了。我想到的一件事就是matrix
会从data.frame
创建{{1}},因此所有列都会被强制转换为单一类型。