将两个标题合并为一个

时间:2013-01-29 12:03:32

标签: r

非常简单的问题。我正在使用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)返回高位名称,但是让第二行与高位名称合并会让我不知所措。

3 个答案:

答案 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
"

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

  1. 首先我们读取数据,因此skip = 2表示跳过前两行
  2. 接下来我们再次读取数据但只读取前两行,然后sapply()进一步处理此输出,我们paste(x, collapse = " ") labs数据帧列中的字符串names。这些内容已分配给dat
  3. 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))