在R中,如何使用Dataframe B中的变量重命名Dataframe A中的变量

时间:2015-11-30 16:25:14

标签: r rename

在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

我有一个像这样的Dataframe 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

因为数据很大,我不能一个接一个地做。是否以编程方式执行此操作?谢谢?如果我的问题不明确,请告诉我。

2 个答案:

答案 0 :(得分:4)

更新

有关更新的问题,请尝试

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"))

答案 1 :(得分:2)

或者您可以使用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"