过滤数据框并使用另一个值更新列

时间:2017-06-09 11:57:12

标签: r dplyr

我有一个包含原始列和目标列的大型数据集(下面的示例)。我需要在Dest2中选择值为“W”(Works from Home)的所有行,并使用Origin值更新它。因此,Dest2中第4行的值将变为BB。

我尝试了一些使用过滤和子集的选项,可以更新所需的行,但所有其他行的值都是NA。

有没有办法只更新Dest2 = W的行?

> TestData #loads it in
      JobID Origin Dest Dest2
  1      1     AA   BB    BB
  2      2     AA   BB    BB
  3      3     BB   AA    AA
  4      4     BB    W     W
  5      5     CC   BB    BB
  6      6     CC   BB    BB
  7      7     CC   BB    BB
  8      8     CC   CC    CC
  9      9     CC   CC    CC
 10    10     DD   AA    AA

3 个答案:

答案 0 :(得分:0)

我知道使用data.table的解决方案:

 setDT(TestData)
 TestData[Dest2 == "W", Dest2 := Origin]
 TestData
#JobID Origin Dest Dest2
#1:     1     AA   BB    BB
#2:     2     AA   BB    BB
#3:     3     BB   AA    AA
#4:     4     BB    W    BB
#5:     5     CC   BB    BB
#6:     6     CC   BB    BB
#7:     7     CC   BB    BB
#8:     8     CC   CC    CC
#9:     9     CC   CC    CC
#10:    10     DD   AA    AA

答案 1 :(得分:0)

TestData$Dest2 <- ifelse(TestData$Dest2 == "W", TestData$Origin, TestData$Dest2)

答案 2 :(得分:0)

Here is a solution using dplyr.

library(dplyr)
TestData2 <- TestData %>%
  mutate(Dest2 = ifelse(Dest2 %in% "W", Origin, Dest2))

Notice the use of %in%. If you want to match multiple strings, not just W, %in% could be a better choice.

Data Preparation

TestData <- read.table(text = "JobID Origin Dest Dest2
1     AA   BB    BB
2     AA   BB    BB
3     BB   AA    AA
4     BB    W     W
5     CC   BB    BB
6     CC   BB    BB
7     CC   BB    BB
8     CC   CC    CC
9     CC   CC    CC
10     DD   AA    AA",
                       header = TRUE, stringsAsFactors = FALSE)