如果存在数据,请根据行ID替换为另一列中的数据

时间:2019-07-12 05:52:36

标签: r dataframe if-statement replace

我想将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()

2 个答案:

答案 0 :(得分:4)

R的基本方式是识别我们要匹配的列的名称(此处为expect(arr).toBeDistinct() ),然后将repunlist替换为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:5paste0("rep", 1:4))。