导入期间自动将值分配给R中的字符串

时间:2015-05-10 14:26:36

标签: r import dataframe

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]])

这是我想要实现的目标的一步一步

  1. 从csv import

  2. 中获取表格列中的字符串列表
  3. 将字符串转换为因子并自动分配int作为 value,输入字符串作为int

  4. 的标签

    如果这可以相对自动化,那么最终用户可以加载csv文件而无需手动分配标签,并自动加载整数,这将有所帮助。

    这有望允许我处理数据框中的数据,而不是将其转换为剥离标签的数据矩阵。

    修改

    y <- rapply(Data,mean,classes="numeric")
    

    似乎可以解决方法,因为我不必转换为数据矩阵。但是在y的结果输出中,我正在丢失Type。这应该是可以解决的。仍然有兴趣知道这是否可以更优雅地完成。

2 个答案:

答案 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