R 将字符转换为具有固定列数的数据帧或矩阵
我试图从一个网站中提取这些值。提取的值如下所示R 将字符转换为具有固定列数的数据帧或矩阵,r,matrix,dataframe,R,Matrix,Dataframe,我试图从一个网站中提取这些值。提取的值如下所示 "3000 ---- ---- ---- ---- '1 UNCH '1" "4600 ---- ---- ---- ---- '1 UNCH '1"
"3000 ---- ---- ---- ---- '1 UNCH '1"
"4600 ---- ---- ---- ---- '1 UNCH '1"
"4800 ---- ---- ---- ---- '1 UNCH '1"
"5000 ---- ---- ---- ---- '1 UNCH '1 300"
"5200 ---- ---- ---- ---- '1 UNCH '1"
"5400 ---- ---- ---- ---- '1 UNCH '1"
"5600 ---- ---- ---- ---- '1 UNCH '1 10"
"5800 ---- ---- ---- ---- '1 UNCH '1 1"
"6000 ---- ---- ---- ---- '1 UNCH '1 5461"
"6200 ---- ---- ---- ---- '1 UNCH '1 54"
"6400 ---- ---- ---- ---- '1 UNCH '1 2009"
"6600 ---- ---- ---- ---- '1 UNCH '1 124"
"6800 ---- ---- ---- ---- '1 UNCH '1 410"
"7000 ---- ---- ---- ---- '1 -'1 '2 10704"
"7200 ---- ---- '2A ---- '2 -'1 '3 9927"
"7400 ---- ---- ---- ---- '3 UNCH '3 7869"
"7600 ---- ---- ---- ---- '4 UNCH '4 30 13596"
"7800 ---- ---- ---- ---- '5 -'1 '6 109 16030"
"8000 '7 '7 '7 '7 '7 -'1 467 1'0 731 26912"
"8200 1'4 1'4 1'3 ---- 1'2 -'2 119 1'4 222 11030"
"8400 2'2 2'2 2'0 2'0 1'7 -'4 426 2'3 172 15743"
"8600 3'1 3'3 2'7 3'0A 3'0 -'4 66 3'4 330 18964"
有些行的列值较少。我想创建一个由11列组成的数据框,空的值应该保持为空。当我尝试基于空间分割值时,列值较少的行会重叠并重复。请找到我试过的代码
cc=gsub("\\s+"," ",df)
cc=data.frame(cc)
cc = data.frame(do.call('rbind', strsplit(as.character(cc),' ',fixed=TRUE)))
更新,原始问题已更改 看起来您的数据是固定宽度格式。您可以使用
?read.fwf
,尽管它的使用在某种程度上取决于数据源的可靠性。如果您获取数据的地方对数据的格式有规定(例如“11列,每列宽10个字符”),这将很有帮助
# pad out each line to the same length
maxlen <- max(sapply(df, nchar)) # it's 110 for your data, it seems
df <- sprintf(paste0("%-", maxlen, "s"), df)
read.fwf(textConnection(df),
widths=c(4, 11, 10, 10, 11, 9, 8, 12, 11, 12, 12))
您可以尝试在列中使用恒定距离,每列包含字符start:end。如果末尾缺少列,则会将NA填充到列中。 变量“line”包含提取文件的一行
start <- c(1,6,17, 27,37,47,57,65,77,88,100)
end <- c(5,16,26,36,46,56,64,76,87,99,110)
columns <- list()
for(j in 1:length(start)){
if(start[j] <= nchar(line)){
columns[[j]] <- substr(line, start[j],end[j])
}
else{
y[[j]] <- NA
}
}
找出您无法尝试使用read.table()
的任何原因?为什么gsub
会弹出空间?似乎在\\s+
上使用strsplit
更有意义,我将在后面的步骤中拆分它。我想用一个单一的空间替换所有空白空间,然后基于单个空间分割值,使用读取线从网页中提取值,并获取我想要的部分。所以我将无法使用read Table,因为它似乎不符合我的要求。谢谢你的帮助。如果第一行的值之间有一些空格,则移动到前面的列中。在某些情况下,我需要将NA放在中间的列中。好的,您最初的问题和可复制的示例没有反映这一点,因此我不介意阅读它。我来看看您的更新问题。列之间的分隔符是制表符还是空格?列之间是否始终至少有4个空格?它们只是空间。。我正试图从这个网站上获取价值观。
start <- c(1,6,17, 27,37,47,57,65,77,88,100)
end <- c(5,16,26,36,46,56,64,76,87,99,110)
columns <- list()
for(j in 1:length(start)){
if(start[j] <= nchar(line)){
columns[[j]] <- substr(line, start[j],end[j])
}
else{
y[[j]] <- NA
}
}