我现在正在处理输入数据框:
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;。
我尝试strtoi
和as.integer
,但它报告了#34;强制引入的NAs&#34;。
有人可以帮忙吗?非常感谢!
答案 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)
并查看每列的类来确认这一点。
几种可能的解决方案:
使用stringsAsFactors=F
读取原始文件时使用read.csv()
参数。这样,Sector列出现在一个字符列中,您不会感到困惑(如果您需要,可以将Sector转换回一个因子,以供分析。
将现有输入$ 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
以防止因果关系。