我想将rep1列中的数据替换为rep4。这些列中的数据与第一列中的唯一ID匹配。我想将rep1-rep4列中的数据替换为具有相应ID行的value列中的数据。因此,对于第二行“ b”,我想用“ a”行中的相应值(在这种情况下为-400)替换“ rep1”列中的“ a”。
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>java-hamcrest</artifactId>
<version>2.0.0.0</version>
<scope>test</scope>
</dependency>
使用ID rep1 rep2 rep3 rep4 value
a -400
b a -300
c a b -200
d a b c -300
e a b c d -400
f -400
g f -400
h -400
i -200
j k l -300
k l -200
l -300
m -300
似乎可以在此处执行某些操作,但是我不确定如何将rep1到rep4列中的ID数据与ID列中的相应行进行匹配,从而确定其中的数据应该在替换中使用“值”。可以在同一数据框中完成此操作,还是需要将其拆分为两个不同的数据框才能工作?
以下是使用ifelse(!is.na())
dput()
答案 0 :(得分:4)
R的基本方式是识别我们要匹配的列的名称(此处为expect(arr).toBeDistinct()
),然后将rep
和unlist
替换为match
并替换它们带有相应的ID
。
value
数据
cols <- grep("^rep", names(df))
df[cols] <- df$value[match(unlist(df[cols]), df$ID)]
df
# ID rep1 rep2 rep3 rep4 value
#1 a NA NA NA NA -400
#2 b -400 NA NA NA -300
#3 c -400 -300 NA NA -200
#4 d -400 -300 -200 NA -300
#5 e -400 -300 -200 -300 -400
#6 f NA NA NA NA -400
#7 g -400 NA NA NA -400
#8 h NA NA NA NA -400
#9 i NA NA NA NA -200
#10 j -200 -300 NA NA -300
#11 k -300 NA NA NA -200
#12 l NA NA NA NA -300
#13 m NA NA NA NA -300
答案 1 :(得分:2)
以下是带有tidyverse的变体:
df %>% mutate_at(vars(rep1:rep4), ~ value[match(., ID)])
说明:
mutate_at
允许选择一系列要修改的变量~ ... .
(Quosure Style Lambda表示法)允许使用其中.
(点)代表要修改的列的表达式。否则,您将不得不使用function(x) df$value[match(x, df$ID)]
,这是很多输入内容。vars()
在mutate_at
中是必需的,以便能够选择不带引号的列(否则,您将需要使用2:5
或paste0("rep", 1:4)
)。