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"。
我尝试执行 strtoi
和 as.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)
并查看每列的 类 来确认这一点。
几个可能的解决方案:
当您使用 read.csv()
读取原始文件时,请使用 stringsAsFactors=F
参数。这样,Sector 列就会出现在字符列中,您就不会感到困惑(如果需要进行分析,您可以随时将 Sector 转换回一个因子。
将现有的输入 $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
以防止强制转换为因子。
我现在正在处理输入数据框:
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"。
我尝试执行 strtoi
和 as.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)
并查看每列的 类 来确认这一点。
几个可能的解决方案:
当您使用
read.csv()
读取原始文件时,请使用stringsAsFactors=F
参数。这样,Sector 列就会出现在字符列中,您就不会感到困惑(如果需要进行分析,您可以随时将 Sector 转换回一个因子。将现有的输入 $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
以防止强制转换为因子。