【问题标题】:Doing simple arithmatic between columns with partially matched names within the same dataframe in R在 R 中的同一数据框中,在名称部分匹配的列之间进行简单的算术运算
【发布时间】:2014-09-10 03:23:28
【问题描述】:

我有一个大型数据框,其中某些列名部分匹配,如下所示

>data
   K55.NSC.     H55.NSC.  K55.TLC.     H55.TLC.
1  27520.09     306.6525  284686.6 8.623333e+00  ... ...
2  57455.33  415244.7340  284693.4 1.319481e+04  ... ...
3  85977.20  814413.8720  284700.1 2.560542e+04  ... ...
4 149511.56 1629331.9228  284713.4 5.103493e+04  ... ...
5 285171.80 3213409.0205  284739.7 1.042913e+05  ... ...
6 510536.16 6233470.3062  284790.7 1.957055e+05  ... ...

我想从 x.TLC 中减去 x.NSC 并创建一个新列作为 x.LLC,其中 x 指的是部分匹配的列名。一种方法是使用“grep”制作单独的数据框:

a <- data[,grep('K55', colnames(data))]
data$k55.LLC <- a[1]-a[2]
... ...

但这很耗时,而且我发现很难为这种情况配置循环。有没有办法在不创建列表的情况下轻松处理数据框中的问题?我发现了一个类似的问题here,但我不确定提供的任何解决方案是否适用于我的情况!

【问题讨论】:

    标签: r


    【解决方案1】:

    一种方法是使用strsplitdata 的列名中提取所有前缀,然后使用sapply 为每个前缀生成减去的值:

    (n <- unique(sapply(strsplit(colnames(data), "\\."), "[", 1)))
    # [1] "K55" "H55"
    sapply(n, function(x) data[,paste0(x, ".TLC.")] - data[,paste0(x, ".NSC.")])
    #            K55           H55
    # [1,]  257166.5     -298.0292
    # [2,]  227238.1  -402049.9240
    # [3,]  198722.9  -788808.4520
    # [4,]  135201.8 -1578296.9928
    # [5,]    -432.1 -3109117.7205
    # [6,] -225745.5 -6037764.8062
    

    如果 data 的列名不以 .TLC 结尾。或 .NSC.,那么您可以使用以下内容过滤掉这些列名:

    (cols <- grep("(\\.TLC\\.$)|(\\.NSC\\.$)", colnames(data), value=TRUE))
    # [1] "K55.NSC." "H55.NSC." "K55.TLC." "H55.TLC."
    

    然后,您可以在上面的第一个片段中使用 cols 而不是 colnames(data)

    【讨论】:

    • 这很有帮助,但是当我在数据框中有一些列并带有其他扩展名时不起作用,例如.LLC。 !可以更新吗?
    • @ToNoY 我已经更新了一些代码,这些代码过滤到以 .TLC 结尾的列名。或 .NSC。
    猜你喜欢
    • 2021-03-04
    • 2021-11-05
    • 2021-08-13
    • 2017-03-07
    • 2014-08-09
    • 1970-01-01
    • 2021-10-26
    • 2012-09-02
    • 1970-01-01
    相关资源
    最近更新 更多