【问题标题】:Renaming and merging columns based on an old/new name dataset基于旧/新名称数据集重命名和合并列
【发布时间】:2019-08-22 06:50:04
【问题描述】:

一个令人困惑的标题。

最好用一个例子来解释。

我有以下数据

df     <- "Green.Apple  Red.Apple Pears  Orange  Lemon  Lime
1               3           5       4      4       0     5
2               3           0       2      7       2     11
3               2           7       8      0       3     1
4               0           6       3      5       6     0 "

df    <-read.table(text=df,header=T)

我想根据旧/新名称重命名列,然后根据旧名称和新名称合并这些列。如果要重命名的列也与另一列相同,则它们将被求和。我把名字带进工作区:

names  <- "Original     New
1         Green.Apple  Apple
2         Red.Apple    Apple
3         Pears        Pear
4         Orange       Orange
5         Lemon        Cirtus
6         Lime         Cirtus"
#

names <-read.table(text=names,header=T)

我尝试了各种解决方法。例如它们将始终具有相同长度的名称,因此可以简单地通过列表重命名列,但这是不正确的,并且可能导致我试图完成的更大任务中出现错误。

这就是我要找的:

yay <- "Apple   Pear  Orange  Cirtus
1         8       4     4       5
2         3       2     7       13
3         9       8     0       4
4         6       3     5       6"

非常感谢

吉姆 (有争议:也对 Pandas 的替代品开放)

【问题讨论】:

    标签: r merge dplyr


    【解决方案1】:

    你也可以这样做:

    names(df) <- names$New[match(names(df), names$Original)]
    t(rowsum(t(df), group = colnames(df), na.rm = T))
    
    # > t(rowsum(t(df), group = colnames(df), na.rm = T))
    # Apple Cirtus Orange Pear
    # 1     8      5      4    4
    # 2     3     13      7    2
    # 3     9      4      0    8
    # 4     6      6      5    3
    

    【讨论】:

    • 这可行,但类似于“变通”,谢谢
    【解决方案2】:

    使用match 将旧名称与新名称匹配并重命名df。然后使用split.default根据相似的名称进行拆分并对相似的列求和。

    names(df) <- names$New[match(names(df), names$Original)]
    sapply(split.default(df, names(df)), rowSums)
    
    #  Apple Cirtus Orange Pear
    #1     8      5      4    4
    #2     3     13      7    2
    #3     9      4      0    8
    #4     6      6      5    3
    

    【讨论】:

    • 该死的,我愚蠢地忘记在我的示例中包含一些位于水果之前的元数据列,无论如何忽略一个列,如果它没有出现在原始名称中。容易解决吗?
    • @Jim 你知道在你感兴趣的实际列之前有多少列吗?您可以删除/选择一些列。 df[3:9] 选择 3-9 列或 df[-(1:2)] 删除前两列。会有帮助吗?
    • 是的,这将是我的解决方案,因为元数据的长度是一致的,因此很容易合并到函数中,谢谢。我在想if(exists 类型的交易。
    • 是的,也可以这样做。 names 数据集中不存在的名称将返回 NA,然后您必须过滤这些名称并仅选择那些不属于 NA 的列。
    • 太棒了,为你的(一致的)帮助干杯,你已经回答了我的 4 个问题,这对我的博士学位很有帮助。所以非常感谢你!非常感谢。
    猜你喜欢
    • 2013-07-19
    • 2018-01-13
    • 2013-01-01
    • 2018-04-05
    • 2023-03-12
    • 1970-01-01
    • 2015-04-05
    • 2019-06-24
    • 2013-07-19
    相关资源
    最近更新 更多