R:在数据帧中将文本(字符)转换为整数类型

时间:2016-08-02 16:38:51

标签: r text dataframe integer read.csv

我现在正在处理输入数据框:

Asset   Sector        Currency    MarketValue
 1       Financial       USD         100000
 2       Financial       USD         100000
...
100      Financial       USD         100000

虽然现在我想在数据框中添加一行,但使用不同的扇区:

101       Energy         USD         100000

我现在正在尝试代码:

newSector        <- rep(input[95,])
newSector$Sector <- "Energy"
input            <- rbind(input,newSector)

但是,从read.csv2()扇区列读取为整数类型,而newSector$Sector <- "Energy"只是将单元格更改为字符类型&#34;能量&#34;因此我&#39; ;我不能rbind他们在一起。 R报告错误:&#34;无效因子级别,NA生成&#34;。

我尝试strtoias.integer,但它报告了#34;强制引入的NAs&#34;。

有人可以帮忙吗?非常感谢!

3 个答案:

答案 0 :(得分:2)

假设您的数据被称为df,您可以尝试以这种方式添加行:

df[101,] <- c(101, "Energy", "USD", 100000)

向量包含字符和数值,但由于R不能包含多个类的向量,因此它将默认为字符。添加此字符向量会将所有4列转换为字符。您可以使用lapply更改要整数的列:

df[c(1,4)] <- lapply(df[c(1,4)], as.integer)

编辑:如果第二列是一个因素,并且添加的值不是此示例中的某个级别,则此操作无效:

df <- data.frame(
  Asset=1:5,
  Sector=rep("Financial", 5),
  Currency=rep("USD",5),
  MarketValue=rep(100000,5)
)

> df[6,] <- c(101, "Energy", "USD", 100000)
Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = "Energy") :
  invalid factor level, NA generated
> df
  Asset    Sector Currency MarketValue
1     1 Financial      USD       1e+05
2     2 Financial      USD       1e+05
3     3 Financial      USD       1e+05
4     4 Financial      USD       1e+05
5     5 Financial      USD       1e+05
6   101      <NA>      USD       1e+05

如果Sector转换为character

,这将有效
> df$Sector <- as.character(df$Sector)
> 
> df[6,] <- c(101, "Energy", "USD", 100000)
> df
  Asset    Sector Currency MarketValue
1     1 Financial      USD       1e+05
2     2 Financial      USD       1e+05
3     3 Financial      USD       1e+05
4     4 Financial      USD       1e+05
5     5 Financial      USD       1e+05
6   101    Energy      USD       1e+05

注意课程:

> sapply(df, class)
      Asset      Sector    Currency MarketValue 
"character" "character"    "factor" "character"

现在使用lapply

> df[c(1,4)] <- lapply(df[c(1,4)], as.integer)
> sapply(df, class)
      Asset      Sector    Currency MarketValue 
  "integer" "character"    "factor"   "integer" 

除非您对数据中的因素有特殊需求,否则我建议您stringsAsFactors = FALSE使用read.csv,如其他答案所述。

答案 1 :(得分:2)

听起来像read.csv()正在读取Sector列是一个因素而不是一个整数(或一个字符串,这是你所期望的)。 R将因子作为整数存储,这就是为什么你得到invalid factor level, NA generated错误。

您可以通过执行str(input)并查看每列的类来确认这一点。

几种可能的解决方案:

  1. 使用stringsAsFactors=F读取原始文件时使用read.csv()参数。这样,Sector列出现在一个字符列中,您不会感到困惑(如果您需要,可以将Sector转换回一个因子,以供分析。

  2. 将现有输入$ Sector转换为字符列:

    input$Sector  <- as.character(input$Sector)
    

答案 2 :(得分:0)

默认情况下,read.csv2表示参数stringsAsFactors = TRUE。因此,列Sector和所有其他字符数据被强制分解为因子级别由整数给出的因子。

请尝试使用stringsAsFactors = FALSE再次阅读输入文件。

如果要追加其他部门,请尝试一下

newsector <- data.frame(Asset = 101, Sector = "Energy", 
                        Currency = "USD", MarketValue = 100000, 
                        stringsAsFactors = FALSE)
input <- rbind(input, newSector)

请注意,此处需要参数stringsAsFactors = FALSE以防止因果关系。