在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
因为数据很大,我不能一个接一个地做。是否以编程方式执行此操作?谢谢?如果我的问题不明确,请告诉我。
答案 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"