0

很简单的问题。我正在使用一个有两行列标题的 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) 返回大写的名字,但是让第二行与大写的名字合并一直让我望而却步。

4

3 回答 3

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)
于 2013-01-29T12:20:57.283 回答
2

使用您的数据,修改为引用包含分隔符的文本字段(获取用于生成文件的任何工具来为您引用文本字段!)

txt <- "Temp Press  Reagent  'Yield A'  'Conversion etc'
degC bar    /g       %        %             
1    2      3        4        5          
6    7      8        9        10
"

下面的这段代码分两步读取文件

  1. 首先我们读取数据,所以skip = 2意味着跳过前两行
  2. 接下来我们再次读取数据,但只读取前两行,然后通过数据帧列中的字符串sapply()进一步处理此输出。这些被分配给paste(x, collapse = " ")labsnamesdat

这是代码:

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"

此外,如果这些标题不是从文件顶部开始,则增加到skipwhere2+nn两个标题行之前的行数。您还需要添加skip = n到生成的第二个read.table()调用labs,其中n又是标题行之前的行数。

于 2013-01-29T12:21:20.697 回答
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))
于 2013-01-29T12:21:34.580 回答