【问题标题】:In R how can I rename variables in Dataframe A with variables in Dataframe B在 R 中,如何使用数据框 B 中的变量重命名数据框 A 中的变量
【发布时间】:2016-03-04 08:41:31
【问题描述】:

在 R 中,我有一个这样的 DataFrame A

          Var 
1         Apple_d1
2         Banana_d1
3         C_d1 
4         D_d1
5         Eye_d1
6         F_d1
7         G_d1

我有一个像这样的数据框 B

              Var 
    1         Apple
    2         Banana
    3         Eye

我想要做的是重命名 DataFrameA 中的变量,其中 Var 的第一部分等于 DataFrameB 中的变量。所以在我的例子中,我希望结果是这样的

              Var 
    1         Apple
    2         Banana
    3         C_d1 
    4         D_d1
    5         Eye
    6         F_d1
    7         G_d1

由于数据量大,无法一一做。有没有一种编程方式来做到这一点?谢谢?如果我的问题不清楚,请告诉我。

【问题讨论】:

  • 请停止将您的代码包装在 javascript 标签中。此外,“用你的代码我得到这个”真的不属于这个问题。此外,目前还不清楚你在和谁说话。
  • 对不起。我会修改我的问题。如果我想在我的问题中放置一个数据框,我应该把它放在哪里?
  • 如果你的意思是如何输入数据而不用 javascript 包装,这里有一些说明:meta.stackexchange.com/questions/22186/… 最后,它看起来和你的一样,只是没有大的“运行代码”每个 data.frame 底部的 sn-p" 按钮。

标签: r rename


【解决方案1】:

或者您可以使用ifelse。假设Var 作为因素。它检查A$Var 的第一个字符是否存在于B$Var

ifelse(substring(A$Var, 1, 1) %in% B$Var, substring(A$Var, 1, 1), as.character(A$Var))

# [1] "A"    "B"    "C_d1" "D_d1" "E"    "F_d1" "G_d1"

编辑

对于更新的问题,你可以试试

ifelse(gsub( "_.*$", "", A$Var ) %in% B$Var, gsub( "_.*$", "", A$Var ), as.character(A$Var))

# [1] "Apple"  "Banana" "C_d1"   "D_d1"   "Eye"    "F_d1"   "G_d1" 

【讨论】:

    【解决方案2】:

    更新:

    对于更新的问题,请尝试

    idx <- grepl(paste(d2$Var, collapse = "|"), d1$Var)
    d1$Var[idx] <- sub("_d1$", "", d1$Var[idx])
    

    这仍将像以前一样构建逻辑索引,但之后,它不会采用固定的子字符串,而是会删除相应行的 _d1 结尾。


    这是一种选择。建立一个逻辑索引,告诉您一行是否包含属于第二个 data.frame 的数据,然后使用它来获取第一个 data.frame 中正确行的子字符串。

    idx <- grepl(paste(d2$Var, collapse = "|"), d1$Var)
    d1$Var[idx] <- substr(d1$Var[idx], 0,1)
    
    > d1
    #   Var
    #1    A
    #2    B
    #3 C_d1
    #4 D_d1
    #5    E
    #6 F_d1
    #7 G_d1
    

    为了更好地理解代码,我建议只运行它的各个部分以逐步理解它:

    > paste(d2$Var, collapse = "|")
    #[1] "A|B|E"
    > grepl(paste(d2$Var, collapse = "|"), d1$Var)
    #[1]  TRUE  TRUE FALSE FALSE  TRUE FALSE FALSE
    > d1$Var[idx]
    #[1] "A_d1" "B_d1" "E_d1"
    > substr(d1$Var[idx], 0,1)
    #[1] "A" "B" "E"
    

    数据

    > dput(d1)
    structure(list(Var = c("A_d1", "B_d1", "C_d1", "D_d1", "E_d1", 
    "F_d1", "G_d1")), .Names = "Var", class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6", "7"))
    > dput(d2)
    structure(list(Var = structure(1:3, .Label = c("A", "B", "E"), class = "factor")), .Names = "Var", class = "data.frame", row.names = c("1", 
    "2", "3"))
    

    【讨论】:

    • 感谢您的回复。我对 R 很陌生。你能解释一下你的代码吗?非常感谢您的帮助!
    • 在我的原始示例中,它运行良好,但我的解决方案有问题。我修改了我的问题你知道为什么会这样吗?
    • 感谢您解释您的代码。你能告诉我 'substr(d1$Var[idx], 0,1)' 中的 0 和 1 是什么意思吗?谢谢 为什么我用您的代码将 Apple_d1 重命名为 A?谢谢
    • @user5601679,感谢您的反馈。构建索引的技巧是通过粘贴 collapse = "|" 将值折叠为 1 个单个字符串,因为 "|" 在 R 的正则表达式函数中被视为逻辑 OR
    猜你喜欢
    • 2012-05-26
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多