【问题标题】:Autoassign values to character strings in R during import在导入期间自动为 R 中的字符串分配值
【发布时间】:2015-07-21 01:32:27
【问题描述】:
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)

在我处理我的数据之后,有没有办法将其恢复为字符/字符串值,这样在进行最终打印时,我会返回 A,而不是 1,2 和 3, B和C?

或者换句话说,当我在导入过程中将其转换为一个因子时,是否无论如何都要为其赋值,类似于this..?

Type <- factor ( i++, labels=as.character(Data[[Type]])

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

  1. 从 csv 导入的表的列中获取字符串列表

  2. 将字符串转换为因子并自动分配一个 int 作为 值,并将输入字符串作为该 int 的标签

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

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

编辑:

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

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

【问题讨论】:

    标签: r import dataframe


    【解决方案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 
    

    【讨论】:

    • 这可以工作,但我试图让脚本自动分配标签,而不是我手动分配/硬编码。
    • 您能否编辑您的问题以使其更明确。此外,如果您想提出一个新问题,我们可以帮助您使用apply 查找数据框中数字列的均值,如果这可以解决您的问题。
    • @RoverEye 是否有预定义的字母值,如果您只是想获得数字值,您可以使用utf8ToInt 并以您喜欢的方式使用以下数字。您可以修改整数以对应更合理的数字。
    • @Konrad 很有趣。如果我进行 utf8toint 转换,我会得到多个数字(我的类型中的每个字符有 2 个数字)。我应该在我的问题中提到类型不是简单的 A 和 Bs 它们是字母数字,代表生物学上的某些东西。我会玩弄这个想法。谢谢。
    • @RoverEye 或者您可以考虑使用以下行中的strtoi&gt; strtoi(c("AA", "BB", "C"), base = 36) 并相应地调整基础。根据您有多少个字母,您可能愿意用十六进制或其他系统对您的字母进行编码。但是,如果我这样想,它就会变得毫无结果,因为实际上您将字母替换为另一个字母。
    【解决方案2】:

    当您读入文件时,您会将其读入数据框。由于这是一个向量列表,Type 向量是因子,Force 向量是整数。即,它们可以不同,因为数据框可以处理不同的类型。这可以通过以下方式确认:

    is(Data$Type)
    is(Data$Force)
    

    但是,当您转换为数据矩阵时,所有列都必须属于同一类型,因此 Type 正在转换为整数以匹配 Force

    Data <- data.matrix(Data)
    is(Data[[1]])  # should be numeric
    

    请参阅 @hadley 的 [高级 R:数据结构章节],这是一个极好的参考。1

    最简单的解决方案是坚持使用数据框,除非您出于某种原因需要使用数据矩阵。如果您必须使用数据矩阵,您可以转换回数据框并使用factor 中的labels 参数再次显式标记变量:

    Data <- data.frame(Data)
    Data$Type <- factor(Data$Type, levels = c(1:3),
                        labels = c("A",
                                   "B",
                                   "C"))
    

    【讨论】:

    • 我需要使用数据矩阵的原因是我必须应用(x,2,mean)并获取每列的平均值和标准差。如果我将其保留为数据框,则应用函数出于某种原因不喜欢它。
    • 我已经编辑了我的问题,包括如何转换回带有标签的因子
    • 如果像Type 这样的变量被编码为一个因子,您将无法计算它的平均值。您是否收到如下错误:> 警告消息:在 mean.default(Data$Type) 中:参数不是数字或逻辑:返回 NA
    • factor(Data$Type, levels = c(1:length(Data$Type),levels=c(Data$Type)) ) 是否也有效?我去试试..
    • 第二个参数是labels(你有两次levels)。无论如何,它可能不起作用,因为在转换为 data.matrix 时标签被剥离。此外,1:length(Data$Type) 是错误的,因为您实际上需要三个级别(A、B、C),而不是向量的长度(即 5)。
    猜你喜欢
    • 2020-12-13
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多