我有以下数据结构,所有变量都是字符串格式:
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中使用一些通用命令,即不包含c1
,c2
和c1c2
的特定值。
非常感谢你的帮助。
答案 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
买者