R:用相应的值替换列中的值

时间:2018-04-11 18:45:32

标签: r dataframe replace

当值满足R?

中的某些条件时,如何替换列中的值?

这里我有两个数据框。

Fruits <- c("Apple", "Grape Fruits", "Lemon", "Peach", "Banana", "Orange", "Strawberry", "Apple")
df1 <- data.frame(Fruits)

df1
   Fruits
   Apple                
   Grape Fruits             
   Lemon                
   Peach                
   Banana               
   Orange               
   Strawberry               
   Apple



Name <- c("Apple", "Orange", "Lemon", "Grape", "Peach","Pinapple")
Rename <- c("Manzana", "Naranja", "Limon", "Uva", "Melocoton", "Anana")
df2 <- data.frame(Name, Rename)

df2
   Name       Rename
   Apple       Manzana          
   Orange      Naranja          
   Lemon       Limon            
   Grape       Uva          
   Peach       Melocoton            
   Pinapple    Anana

我想将df1$Fruits中的值替换为df2$Rename中的相应值,仅当df1$Fruits中的每个值与df2$Name中的值匹配时才会显示。

所以指定的数据框就是这样的。

  Fruits
  Manzana                
  Grape Fruits             
  Limon                
  Melocoton                
  Banana               
  Naranja               
  Strawberry               
  Manzana

有人知道怎么做吗?非常感谢你的帮助。

3 个答案:

答案 0 :(得分:1)

使用plyr

library(plyr)
new.fruits <- mapvalues(Fruits, from = Name, to = Rename)
df <- data.frame(Fruits=new.fruits)

答案 1 :(得分:0)

您可以使用merge,然后用各自的成果替换所有NA。

df3 <- merge(df1,df2, by.x = "Fruits", by.y = "Name", all.x = T)
df3$Rename[is.na(df3$Rename)] <- df3$Fruits[is.na(df3$Rename)]

如果您需要保留订单:

df1$id  <- 1:nrow(df1)
df3 <- merge(df1,df2, by.x = "Fruits", by.y = "Name", all.x = T)
df3$Rename[is.na(df3$Rename)] <- df3$Fruits[is.na(df3$Rename)]
df3 <- df3[order(df3$id),]
data.frame(Fruits = df3[,"Rename"])
#        Fruits
# 1      Manzana
# 2 Grape Fruits
# 3        Limon
# 4    Melocoton
# 5       Banana
# 6      Naranja
# 7   Strawberry
# 8      Manzana

来自@Wen以下的match解决方案

df1$new=df2$Rename[match(df1$Fruits,df2$Name)]
df1$new[is.na(df1$new)] <- df1$Fruits[is.na(df1$new)]

答案 2 :(得分:0)

applypmatch一起使用可以提供所需的输出。

df1$Fruits <- apply(df1,1,function(x){
  matched = (df2$Name == x)
  if(any(matched)){
    as.character(df2$Rename[matched])
  } else {
    x
  }})

df1
#         Fruits
# 1      Manzana
# 2 Grape Fruits
# 3        Limon
# 4    Melocoton
# 5       Banana
# 6      Naranja
# 7   Strawberry
# 8      Manzana