在满足R中条件的值上添加前缀

时间:2018-08-10 16:24:42

标签: r dplyr data.table

因此,我一直在寻找与该主题类似的东西。我正在尝试在满足另一列条件的数据值中添加前缀。

我正在使用dplyrdata.table

例如,我有这个数据框df1,其中包含这些列。

Program | Violation
-------------------
CACF    |  SV-300
CACF    |  SV-101
DCH     |  SV-205
DCH     |  SV-302
CACF    |  SV-403
DCH     |  SV-302

我想在违规ID号之前添加DCH-,而不要更改另一列。我想对现有列进行此操作,以使现有df1看起来像这样。

Program | Violation
-------------------
CACF    |  SV-300
CACF    |  SV-101
DCH     |  DCH-SV-205
DCH     |  DCH-SV-302
CACF    |  SV-403
DCH     |  DCH-SV-302

我一直在尝试paste0函数,但无济于事。

df1$Violation = paste0("DCH-"), df1$Program == "DCH"

我对R还是比较陌生,并且一直在Google搜索并四处寻找如何执行此操作。我敢肯定它非常简单,但是找不到与我正在寻找的相似概念的线程。如果有,请链接。

3 个答案:

答案 0 :(得分:3)

我们可以使用case_when

library(dplyr)
df1 %>%
   mutate(Violation = case_when(Program == "DCH" ~ paste0("DCH-", Violation), 
                         TRUE ~ Violation))

答案 1 :(得分:3)

data.table方式

library(data.table)
setDT(df1)
df1[Program == "DCH", Violation := paste0(Program, "-", Violation)]
df1
   Program  Violation
1:    CACF     SV-300
2:    CACF     SV-101
3:     DCH DCH-SV-205
4:     DCH DCH-SV-302
5:    CACF     SV-403
6:     DCH DCH-SV-302

或基数R:

df1[["Violation"]] <- 
  with(df1, ifelse(Program == "DCH", paste0(Program, "-", Violation), Violation))

df1

  Program  Violation
1    CACF     SV-300
2    CACF     SV-101
3     DCH DCH-SV-205
4     DCH DCH-SV-302
5    CACF     SV-403
6     DCH DCH-SV-302

哪里

df1 <- data.frame(
  Program = c("CACF", "CACF", "DCH", "DCH", "CACF", "DCH"), 
  Violation = c("SV-300", "SV-101", "SV-205", "SV-302", "SV-403", "SV-302"),
  stringsAsFactors = FALSE
)

答案 2 :(得分:0)

我更喜欢使用@akrun的dplyr答案。 有时最好使用“ Base R”

数据:

df1 <-
  read.table(text = "
Program, Violation
CACF,SV-300
CACF,SV-101
DCH,SV-205
DCH,SV-302
CACF,SV-403
DCH,SV-302", sep = ",",
           header = T,
           stringsAsFactors = F)

解决方案: 使用标准索引选择要修改的案例:1)根据您的条件过滤行,然后2)选择列

df1[df1$Program=="DCH", "Violation"] <- # select the row and column using indexing [row, col]
  paste0("DCH-", df1[df1$Program=="DCH", "Violation"])

df1
  Program  Violation
1    CACF     SV-300
2    CACF     SV-101
3     DCH DCH-SV-205
4     DCH DCH-SV-302
5    CACF     SV-403
6     DCH DCH-SV-302