用另一个字符串

时间:2015-11-08 19:19:34

标签: r replace

我有以下数据结构,所有变量都是字符串格式:

    v1      v2      c1      c2           c1c2
00035A  943567  00088E  63968E  00088E;63968E
00088E  63968E  00088E  63968E  00088E;63968E
00088E  925524  00088E  63968E  00088E;63968E
000361  237924  00088E  63968E  00088E;63968E
000361  83367A  00088E  63968E  00088E;63968E
00055X  49328R  00088E  63968E  00088E;63968E
00056N  87885Q  00088E  63968E  00088E;63968E
000794  69911G  00088E  63968E  00088E;63968E
23792A  001674  00088E  63968E  00088E;63968E
63968E  17275R  00088E  63968E  00088E;63968E

我想做的是将v1的值c1c2替换为v1=c1,将v2替换为c1c2 v2=c2通过在R中使用一些通用命令,即不包含c1c2c1c2的特定值。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点:

基础R中带有ifelse语句的

1:

df$v1 <- ifelse(df$v1==df$c1, df$c1c2, df$v1)
df$v2 <- ifelse(df$v2==df$c2, df$c1c2, df$v2)

2:或使用子集分配:

df[df$v1==df$c1,"v1"] <- df[df$v1==df$c1,"c1c2"]
df[df$v2==df$c2,"v2"] <- df[df$v2==df$c2,"c1c2"]

3:或使用 data.table 包:

library(data.table)
setDT(df)[v1==c1, v1 := c1c2][v2==c2, v2 := c1c2]

这些解决方案中的每一个都给出了以下结果:

> df
               v1            v2     c1     c2          c1c2
 1:        00035A        943567 00088E 63968E 00088E;63968E
 2: 00088E;63968E 00088E;63968E 00088E 63968E 00088E;63968E
 3: 00088E;63968E        925524 00088E 63968E 00088E;63968E
 4:        000361        237924 00088E 63968E 00088E;63968E
 5:        000361        83367A 00088E 63968E 00088E;63968E
 6:        00055X        49328R 00088E 63968E 00088E;63968E
 7:        00056N        87885Q 00088E 63968E 00088E;63968E
 8:        000794        69911G 00088E 63968E 00088E;63968E
 9:        23792A        001674 00088E 63968E 00088E;63968E
10:        63968E        17275R 00088E 63968E 00088E;63968E

答案 1 :(得分:0)

在自联接

中使用更新还有另一种方法
library(data.table)
#coerce to data.table
setDT(df)[
  # 1st self join & update
  df, on = .(v1 = c1), v1 := c1c2][
    # 2nd slef join & update
    df, on = .(v2 = c2), v2 := c1c2][]
               v1            v2     c1     c2          c1c2
 1:        00035A        943567 00088E 63968E 00088E;63968E
 2: 00088E;63968E 00088E;63968E 00088E 63968E 00088E;63968E
 3: 00088E;63968E        925524 00088E 63968E 00088E;63968E
 4:        000361        237924 00088E 63968E 00088E;63968E
 5:        000361        83367A 00088E 63968E 00088E;63968E
 6:        00055X        49328R 00088E 63968E 00088E;63968E
 7:        00056N        87885Q 00088E 63968E 00088E;63968E
 8:        000794        69911G 00088E 63968E 00088E;63968E
 9:        23792A        001674 00088E 63968E 00088E;63968E
10:        63968E        17275R 00088E 63968E 00088E;63968E

买者