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

R:将数据帧中的文本(字符)转换为整数类型,r,text,dataframe,integer,read.csv,R,Text,Dataframe,Integer,Read.csv,我现在正在处理一个输入数据帧: Asset Sector Currency MarketValue 1 Financial USD 100000 2 Financial USD 100000 ... 100 Financial USD 100000 而现在我想在数据框中添加一行,但具有不同的扇区: 101 Energy U

我现在正在处理一个输入数据帧:

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)

newSector假设您的数据被调用为
df
,您可以尝试以下方式添加行:

df[101,] <- c(101, "Energy", "USD", 100000)
编辑:如果第二列是一个因子,并且所添加的值不是本例中的某个级别,则此操作无效:

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
请注意这些类:

> sapply(df, class)
      Asset      Sector    Currency MarketValue 
"character" "character"    "factor" "character"
现在使用
lappy

> df[c(1,4)] <- lapply(df[c(1,4)], as.integer)
> sapply(df, class)
      Asset      Sector    Currency MarketValue 
  "integer" "character"    "factor"   "integer" 
>df[c(1,4)]sapply(df,class)
资产部门货币市场价值
“整数”“字符”“因子”“整数”

除非您对数据中的因子有特殊的需求,否则我建议您在阅读其他答案中提到的.csv时使用
stringsafactors=FALSE

听起来像是
read.csv()
正在阅读,扇区列是作为因子而不是整数(或字符串,这是您所期望的)。R将因子作为整数存储在封面下,这就是为什么您会得到
无效因子级别,NA生成的
错误

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

两种可能的解决方案:

  • 使用
    read.csv()
    读取原始文件时,请使用
    stringsAsFactors=F
    参数。这样,扇形列以a字符列的形式出现,您就不会感到困惑(如果您在分析中需要扇形,您可以随时将其转换回因子)

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

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

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

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

    如果要附加一个额外的扇区,请尝试其他方法

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

    newsector您以错误的方式引入了新级别。请尝试
    levels(input$Sector)=c(levels(input$Sector),“Energy”)
    首先。你确定你在这里需要因子吗?嗨,皮埃尔,谢谢你告诉我这个方法。它与
    rbind
    新行一起工作,但是我发现我不应该只对新行做
    rep
    ,因为它保留了“Financial”的值,而只是将名称改为“Energy”,这与我稍后使用“金融”和“能源”相关矩阵的计算结果不符。我使用了@Uwe Block的方法,它引导我得到了我想要的结果。谢谢!你测试过这个吗?你不能这样逃避因子级别定义。谢谢你Uwe!我没有更改
    read.csv2
    设置,因为其他文件中也有人在使用它。我设置了
    newsector
    
    input$Sector  <- as.character(input$Sector)
    
    newsector <- data.frame(Asset = 101, Sector = "Energy", 
                            Currency = "USD", MarketValue = 100000, 
                            stringsAsFactors = FALSE)
    input <- rbind(input, newSector)