【问题标题】:removing columns in csv format in R language在 R 语言中删除 csv 格式的列
【发布时间】:2012-11-25 20:14:27
【问题描述】:

我有以下 csv 格式的表格:

我在 csv 格式的表格中有以下基因信息:

                    1       3       1       2     2         3
1415670_at  1   365.1   293.4   288.9   394.5   312     381.6
1415671_at  2   556.1   584.2   567.8   592.8   471.6   513.1
1415672_at  3   1048.3  763.1   1074.9  852.3   826.1   898.3
1415673_at  4   60.8    51.7    51.6    224     248.4   150.7
1415674_at  5   129.1   107.2   230.4   175.5   250.5   172.4

如您所见,我得到了一些标有 1,2 和 3 的列。我制作了一个 VB 脚本,用于删除与 Ex​​cel 中的 1 和 2 不同的列。我的问题是如何仅使用 R 来做到这一点?这样我的结果表将是:

                    1   1       2          2        
1415670_at  1   365.1   293.4   394.5     312       
1415671_at  2   556.1   584.2   592.8   471.6   
1415672_at  3   1048.3  763.1   852.3   826.1   
1415673_at  4   60.8    51.7    224     248.4   
1415674_at  5   129.1   107.2   175.5   250.5   

顺便说一句,这只是一个示例,我可以将其他列标记为 4、5 和 6,但我只想保留标记为 1 和 2 的列

我试过贴出来的解决办法,就是用:

m<-read.csv("test1.csv")
smallerdat <- m[ grep("^X1$|^X2$|X1\\.|X2\\." , names(m) ) ]

其中 m 是 csv 格式的表格,但我得到的结果是:

    X1  X1.1        X2      X2.2        
365.1   293.4   394.5     312       
556.1   584.2   592.8   471.6   
1048.3  763.1   852.3   826.1   
60.8    51.7    224     248.4   
129.1   107.2   175.5   250.5

所以它正在删除我需要的前两列。如何不删除这些列?以及如何保持原始格式,我的意思是标题中只有1和2,而不是那些Xs

【问题讨论】:

  • read.csv 读取文件,然后子集选择一些列。

标签: r csv


【解决方案1】:

将数据读入名为“indat”的数据框后

 smallerdat <- indat[ grep("^X1|^X2", names(indat) )]

如果列不大于 0-9 将起作用。如果它们的字符值更大,你会在那个网络中得到“11”或“21”,所以可能需要更复杂的东西:

 smallerdat <- indat[ grep("^X1$|^X2$|X1\\.|X2\\." , names(indat) ) ]

【讨论】:

  • 亲爱的@DWin 我已经尝试了你的解决方案,但仍然有问题,请你帮我解决编辑后的问题好吗?
  • 我猜想第一个“列”应该被读取为行名,但显然它是以列的形式出现的。试试这个:m[ c(1,2, grep("^X1$|^X2$|X1\\.|X2\\." , names(m) ) ) ]
【解决方案2】:

只需使用 cbind() 合并尽可能多的表格列即可;

newtable <- cbind( table[1], table[2], table[3], ..)

其中 table[1] 是表格的第一列,table[2] 是第二列,依此类推。

因为 cbind() 可以接受任意数量的参数。

如果你喜欢的话,然后命名列;

colnames(newtable) <- list("First", "Second", "Third")

【讨论】:

    【解决方案3】:

    马诺洛,

    您必须将数据读入数据框中并删除列。唯一需要考虑的是列名不能相同。

    # Your data
    data <- read.table(text = "1       3       1       2       2       3
                               365.1   293.4   288.9   394.5   312     381.6
                               556.1   584.2   567.8   592.8   471.6   513.1
                               1048.3  763.1   1074.9  852.3   826.1   898.3
                               60.8    51.7    51.6    224     248.4   150.7
                               129.1   107.2   230.4   175.5   250.5   172.4",
            header=TRUE, sep="", nrows=5)
    

    之后如果你运行

    print(data)
    

    你会得到

          X1    X3   X1.1    X2  X2.1  X3.1
    1  365.1 293.4  288.9 394.5 312.0 381.6
    2  556.1 584.2  567.8 592.8 471.6 513.1
    3 1048.3 763.1 1074.9 852.3 826.1 898.3
    4   60.8  51.7   51.6 224.0 248.4 150.7
    5  129.1 107.2  230.4 175.5 250.5 172.4
    

    如果您删除名为 X3 和 X3.1 的列

    data <- data[, !(colnames(data) %in% c("X3","X3.1"))]
    

    并执行

    print(data)
    

    你现在会得到

          X1   X1.1    X2  X2.1
    1  365.1  288.9 394.5 312.0
    2  556.1  567.8 592.8 471.6
    3 1048.3 1074.9 852.3 826.1
    4   60.8   51.6 224.0 248.4
    5  129.1  230.4 175.5 250.5
    

    希望对您有所帮助! :)

    【讨论】:

    • 如何只保留标记为 1 和 2 的列?因为我可能有不止一列标有不同的值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多