非常简单的问题。我正在使用excel表,列标题有两行;如何将这两行标题转换为一个?此外,这些标题不会从表格的顶部开始。
因此,我有DF1
Temp Press Reagent Yield A Conversion etc
degC bar /g % %
1 2 3 4 5
6 7 8 9 10
我想要,
Temp degC Press bar Reagent /g Yield A % Conversion etc
1 2 3 4 5
6 7 8 9 10
使用colnames(DF1)返回高位名称,但是让第二行与高位名称合并会让我不知所措。
答案 0 :(得分:2)
这应该有效。在读取数据时,您只需要设置stringsAsFactors = FALSE。
data <- structure(list(Temp = c("degC", "1", "6"), Press = c("bar", "2",
"7"), Reagent = c("/g", "3", "8"), Yield.A = c("%", "4", "9"),
Conversion = c("%", "5", "10")), .Names = c("Temp", "Press",
"Reagent", "Yield.A", "Conversion"), class = "data.frame", row.names = c(NA,
-3L)) # Your data
colnames(data) <-paste(colnames(dados),dados[1,]) # Set new names
data <- data[-1,] # Remove first line
data <- data.frame(apply(data,2,as.real)) # Correct the classes (works only if all collums are numbers)
答案 1 :(得分:2)
使用您的数据,修改为引用包含分隔符的文本字段(获取用于生成文件的任何工具,为您引用文本字段!)
txt <- "Temp Press Reagent 'Yield A' 'Conversion etc'
degC bar /g % %
1 2 3 4 5
6 7 8 9 10
"
下面的代码片段分两步读取文件
skip = 2
表示跳过前两行sapply()
进一步处理此输出,我们paste(x, collapse = " ")
labs
数据帧列中的字符串names
。这些内容已分配给dat
dat <- read.table(text = txt, skip = 2)
labs <- read.table(text = txt, nrows = 2, stringsAsFactors = FALSE)
names(dat) <- sapply(labs, paste, collapse = " ")
dat
names(dat)
醇>
以下是代码:
> dat <- read.table(text = txt, skip = 2)
> labs <- read.table(text = txt, nrows = 2, stringsAsFactors = FALSE)
> names(dat) <- sapply(labs, paste, collapse = " ")
>
> dat
Temp degC Press bar Reagent /g Yield A % Conversion etc %
1 1 2 3 4 5
2 6 7 8 9 10
> names(dat)
[1] "Temp degC" "Press bar" "Reagent /g"
[4] "Yield A %" "Conversion etc %"
代码在运行时产生:
read.table()
在您的情况下,您需要修改file = "foo.txt"
次调用以指向文件系统上的文件,因此在代码块中使用text = txt
代替"foo.txt"
,其中skip
是您文件的名称。
此外,如果这些标题不是从文件的顶部开始,那么请将2+n
增加到n
,其中skip = n
是之前的行数>两个标题行。您还需要将read.table()
添加到生成labs
的第二个n
来电,其中{{1}}再次是标题行前的行数。
答案 2 :(得分:2)
只需使用read.table(file, header = FALSE, stringsAsFactors = F)
参数加载文件即可。然后,您可以grep
找到发生这种情况的位置。
df <- data.frame(V1=c(sample(10), "Temp", "degC"),
V2=c(sample(10), "Press", "bar"),
V3 = c(sample(10), "Reagent", "/g"),
V4 = c(sample(10), "Yield_A", "%"),
V5 = c(sample(10), "Conversion", "%"),
stringsAsFactors=F)
idx <- unique(c(grep("Temp", df$V1), grep("degC", df$V1)))
df2 <- df[-(idx), ]
names(df2) <- sapply(df[idx, ], function(x) paste(x, collapse=" "))
在这里,如果需要,您可以将所有列转换为数字,如下所示:
df2 <- as.data.frame(sapply(df2, as.numeric))