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)