R转换列,字符串作为字符,而不是因子

时间:2014-03-11 02:03:32

标签: r dataframe r-factor

我对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)。最安全的方法是什么?是否有类似的陷阱需要注意,例如使用applyplyr函数?

1 个答案:

答案 0 :(得分:3)

transformdata.frame的问题不同,stringsAsFactors默认设置为TRUEFALSE。添加一个应该是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.frameapply来查看每个来源。


至于其他陷阱,这个问题太宽泛了。我想到的一件事就是matrix会从data.frame创建{{1}},因此所有列都会被强制转换为单一类型。