【问题标题】:replace column values in data.frame with character string depending on column value, in R在 R 中,根据列值用字符串替换 data.frame 中的列值
【发布时间】:2015-12-06 00:21:26
【问题描述】:

我有一个 data.frame 'data',其中一列包含 1:100 之间的整数值,它们是它们所代表的 Isolate 的编码值。

这是我的示例数据,“数据”:

     Size    Isolate    spin
 1   primary   3          up
 2   primary   4        down
 3   sec       6     strange
 4   ter       1       charm
 5   sec       3      bottom
 6   quart     2         top

我有另一个 data.frame,其中包含整数和 Isolate 名称之间的键

1  alpha
2  bravo
3  charlie
4  delta
5  echo
6  foxtrot
7  golf

这个列表有 100 个 Isolates,太多了,无法用 if/else 手动输入。

我想知道一个简单的解决方案,用第二个 data.frame 中的相应 Isolate 名称替换我的第一个 data.frame 中的整数,如您所见,它不是按升序排列的。

经过研究,我试过了:

 data$Isolate <- as.numeric(factor(data$Isolate,
  levels =c("alpha","bravo","charlie","delta","echo","foxtrot","golf") 
    )
  )

但这只是用 N/A 替换了 Isolate 列。

【问题讨论】:

  • 你可以使用merge()

标签: r replace


【解决方案1】:
df$Isolate <- df2[,1][df$Isolate]
#      Size Isolate    spin
# 1 primary charlie      up
# 2 primary   delta    down
# 3     sec foxtrot strange
# 4     ter   alpha   charm
# 5     sec charlie  bottom
# 6   quart   bravo     top

您可以按目标数据框对查找数据框进行子集化。

数据

df <- structure(list(Size = structure(c(1L, 1L, 3L, 4L, 3L, 2L), .Label = c("primary", 
"quart", "sec", "ter"), class = "factor"), Isolate = c(3L, 4L, 
6L, 1L, 3L, 2L), spin = structure(c(6L, 3L, 4L, 2L, 1L, 5L), .Label = c("bottom", 
"charm", "down", "strange", "top", "up"), class = "factor")), .Names = c("Size", 
"Isolate", "spin"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))

df2 <- structure(list(V2 = structure(1:7, .Label = c("alpha", "bravo", 
"charlie", "delta", "echo", "foxtrot", "golf"), class = "factor")), .Names = "V2", class = "data.frame", row.names = c(NA, 
-7L))

【讨论】:

    【解决方案2】:

    使用factor,你可以试试:

    data$Isolate <- factor(data$Isolate,
      levels=1:7,
      labels =c("alpha","bravo","charlie","delta","echo","foxtrot","golf"))
    

    如果您有许多级别已经在他们自己的 data.frame 中,您可以自动执行此操作。

    data$Isolate <- factor(data$Isolate,levels=code$No,labels=code$Value)
    

    使用您的第二个 data.frame,code

    code <- read.table(text="1  alpha
    2  bravo
    3  charlie
    4  delta
    5  echo
    6  foxtrot
    7  golf",stringsAsFactor=FALSE)
    names(code) <- c("No","Value")
    

    【讨论】:

      【解决方案3】:

      正如 Hubert 在 cmets 中所说,这是 merge 的一个简单用例。

      假设你的第二个“关键”数据框的列名是“Isolate”和“Isolate_Name”,那么它就像

      merge(data, key_data, by = "Isolate")
      

      默认是“内连接”,它只保留匹配的记录。如果您担心丢失不匹配的记录,可以添加参数all.x = TRUE

      如果您更喜欢非基础软件包,data.tabledplyr 也很容易。

      【讨论】:

        猜你喜欢
        • 2015-06-30
        • 1970-01-01
        • 2023-01-30
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        • 2020-05-29
        • 2021-06-08
        • 1970-01-01
        相关资源
        最近更新 更多