Type Force
A 30
A 40
B 20
C 10
C 14
我有一个像上面那样的数据集,我从CSV导入,就像这样。我正在将类型转换为因子。
Data <- read.csv(csvImport)
Data <- within(Data,
{
Type <- factor(as.character(Data[[Type]] )
})
但是,当我将其转换为用于下游处理的数据矩阵时,值会自动转换为整数,这是公平的。
x <- data.matrix(Data)
在我处理数据之后,是否还有将其恢复为字符/字符串值,以便在进行最终打印时,而不是1,2和3我有A, B和C?
或者换句话说,当我在导入过程中将其转换为一个因子时,无论如何都要为它赋值,这就是这个......?
Type <- factor ( i++, labels=as.character(Data[[Type]])
这是我想要实现的目标的一步一步
从csv import
将字符串转换为因子并自动分配int作为 value,输入字符串作为int
如果这可以相对自动化,那么最终用户可以加载csv文件而无需手动分配标签,并自动加载整数,这将有所帮助。
这有望允许我处理数据框中的数据,而不是将其转换为剥离标签的数据矩阵。
修改
y <- rapply(Data,mean,classes="numeric")
似乎可以解决方法,因为我不必转换为数据矩阵。但是在y的结果输出中,我正在丢失Type。这应该是可以解决的。仍然有兴趣知道这是否可以更优雅地完成。
答案 0 :(得分:1)
当您读入文件时,您将其读入数据框。由于这是向量列表,Type
向量是因子,Force
向量是整数。即,它们可以是不同的,因为数据框可以处理不同的类型。这可以通过以下方式确认:
is(Data$Type)
is(Data$Force)
但是,当您转换为数据矩阵时,所有列必须属于同一类型,因此Type
将转换为与Force
匹配的整数:
Data <- data.matrix(Data)
is(Data[[1]]) # should be numeric
请参阅@hadley的[高级R:数据结构章节],这是一个极好的参考。1
最简单的解决方案是坚持使用数据框,除非您因某种原因需要使用数据矩阵。如果必须使用数据矩阵,则可以转换回数据框,并使用labels
中的factor
参数再次明确标记变量:
Data <- data.frame(Data)
Data$Type <- factor(Data$Type, levels = c(1:3),
labels = c("A",
"B",
"C"))
答案 1 :(得分:1)
如何使用levels
vec.letters <- paste(letters,sep="")
levels(vec.letters)<- 1:length(vec.letters)
然后
vec.letters
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x"
[25] "y" "z"
attr(,"levels")
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
或者可能是更实用的解决方案:
vec.three.ltrs <- c("A", "B", "C")
codes = c(A=1,B=2,C=3)
new.vec = sapply(vec.three.ltrs,function(x)codes[x])
会给你:
> new.vec
A.A B.B C.C
1 2 3