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

R: Convert text (character) into integer type in a data frame

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

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"只是将单元格更改为字符类型"Energy",所以我不是能够 rbind 他们在一起。 R报错:"invalid factor level, NA generated"。

我尝试执行 strtoias.integer 但它报告 "NAs introduced by coercion"。

有人能帮忙吗?非常感谢!

假设您的数据名为 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" 

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

在我看来,read.csv() 正在读取“扇区”列作为一个因子而不是一个整数(或字符串,这是您所期望的)。 R 在幕后将因子存储为整数,这就是您收到 invalid factor level, NA generated 错误的原因。

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

几个可能的解决方案:

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

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

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

默认情况下,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 以防止强制转换为因子。