【问题标题】:Replacing value in one column with one in another based on string match根据字符串匹配将一列中的值替换为另一列中的值
【发布时间】:2016-06-27 10:11:08
【问题描述】:

假设我有一个大约 7 列的数据框。第一列包含一个数字列表,其他列是数字后跟单词。

假设数字是 15。我想让 R 查看其他 6 列,找到哪一列有“15”并将该条目的内容复制到我的数字列中。

我该怎么做?

编辑:假设 R 搜索时不会有多个匹配项。

【问题讨论】:

  • 如果多列与一个数字匹配会怎样?
  • 我忘了提,但假设不可能发生多个匹配。
  • 创建一个我们可以使用的小例子

标签: r


【解决方案1】:

如果我正确理解您的要求,您可以在每一行上独立使用grep()value=T,传递一个必须从第一列中的数字动态构造的正则表达式,并用结果向量覆盖数字列.

## generate data
set.seed(1L); NR <- 5L; NC <- 7L;
nums <- sample(seq_len(NR));
df <- data.frame(num=nums,t(sapply(nums,function(num) paste0(sample(if (NC-1L>=num) seq_len(NC-1L) else c(num,seq_len(NC-2L))),sample(letters,NC-1L,T)))));
df;
##   num X1 X2 X3 X4 X5 X6
## 1   2 6e 5r 3j 2u 1m 4s
## 2   5 6d 2g 4k 3a 1j 5w
## 3   4 3r 6u 5c 2s 1k 4v
## 4   3 4m 6t 3s 2m 5w 1l
## 5   1 2k 1x 5h 4l 6i 3q

## solution
df$num <- sapply(seq_len(nrow(df)),function(ri) grep(value=T,paste0('^',df$num[ri],'($|[^0-9])'),unlist(df[ri,-1L])));
##   num X1 X2 X3 X4 X5 X6
## 1  2u 6e 5r 3j 2u 1m 4s
## 2  5w 6d 2g 4k 3a 1j 5w
## 3  4v 3r 6u 5c 2s 1k 4v
## 4  3s 4m 6t 3s 2m 5w 1l
## 5  1x 2k 1x 5h 4l 6i 3q

这假设每个数字都与一个列值完全匹配。

【讨论】:

    猜你喜欢
    • 2016-11-22
    • 2015-06-27
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2021-02-14
    相关资源
    最近更新 更多