使用R的tm包,我已将PDF表格转换为文本。我的目标是将PDF表格转换为数据框架。 PDF文件中的原始表具有以下结构:
1. [EMPTY] , V1 , V2 , V3
2. 01-01-2015 , 1.23 , 3.45 , 5.67
3. 02-01-2015 , 8.9 , 1.23 , 4.56
第一列是日期但没有列名,而列以逗号分隔。 tm包错误地将表转换为文本,使得日期列向上错误地向上移动:
1. 01-01-2015 , V1 , V2 , V3
2. 02-01-2015 , 1.23 , 3.45 , 5.67
3. 03-01-2015 , 8.90 , 1.23 , 4.56
使得日期不再对应于正确的变量值V1,V2等
我需要将第一列向下移动以正确地重新对齐日期和值而不移动其他列。当我最初将PDF转换为文本时,或者在我将文本转换为数据框之后,我可以使用tm这样做。我尝试使用data.table和其他工具来追求后一种策略,但没有取得成功。
任何人都可以建议任何改变单列值而不改变其他列值的策略吗?
答案 0 :(得分:0)
假设您的示例中设置的数据框设置不正确(第一行包含变量名称),您可以使用lag
中的dplyr
。
library(dplyr)
mydf$mydate <- lag(mydf$mydate, 1)
答案 1 :(得分:0)
在数据框中转换PDF后,您可以在几个步骤中解决此问题。在基地R:
# set column names
names(mydf) <- c("date", as.character(unlist(mydf[1, 2:4])))
# shift the date column with one row downward
mydf$date <- lag(mydf$date, 1)
# delete the unnecessary first row
mydf <- mydf[-1,]
# set the column classes in the correct format
mydf$date <- as.Date(mydf$date, format="%d-%m-%Y")
mydf[,c(2:4)] <- lapply(mydf[,c(2:4)], function(x) as.numeric(as.character(x)))
使用 data.table 包:
names(mydf) <- c("date", as.character(unlist(mydf[1, 2:4])))
library(data.table)
mydf <- setDT(mydf)[, date := shift(date, 1)][-1]
mydf[, date := as.Date(date, format="%d-%m-%Y")
][, c("V1","V2","V3") := lapply(.SD, function(x) as.numeric(as.character(x))), .SDcols = c("V1","V2","V3")]
使用过的示例数据:
mydf <- read.table(text="
01-01-2015 V1 V2 V3
02-01-2015 1.23 3.45 5.67
03-01-2015 8.90 1.23 4.56
", header=FALSE)