1

我有一个示例数据框:

dat <- data.frame(V1 = c("Non Debt Balance","Non Debt Income","Non Debt Cost"), 
              V2 = c("Average Balance","Income","Cost"), 
              V3 = c("Trade","Sales Finance","Trade"))

我想根据列 V2 的值创建一个新列。如果 V2 列是 %in% ("Income","Cost"),那么我希望新列选择 V3 列,如果不在列表中,则选择 V2。

我正在考虑使用 %in% 函数,但不确定如何在此列表中执行 if 然后获取此列,否则获取此列逻辑。

非常感谢您的帮助。问候,

4

3 回答 3

3

这是你要找的吗?

library(dplyr)

dat %>% 
  mutate(V4 = case_when(V2 == "Income" | V2 == "Cost" ~ V3,
                        TRUE ~ V2))

                V1              V2            V3              V4
1 Non Debt Balance Average Balance         Trade Average Balance
2  Non Debt Income          Income Sales Finance   Sales Finance
3    Non Debt Cost            Cost         Trade           Trade

或者,使用%in%你提到的:

dat %>% 
  mutate(V4 = case_when(V2 %in% c("Cost", "Income") ~ V3,
                        TRUE ~ V2))

数据:

dat <- data.frame(V1 = c("Non Debt Balance","Non Debt Income","Non Debt Cost"), 
                  V2 = c("Average Balance","Income","Cost"), 
                  V3 = c("Trade","Sales Finance","Trade"),
                  stringsAsFactors = FALSE)
于 2018-02-01T22:06:01.803 回答
2
dat$NewCol <- ifelse(dat$V2 %in% c('Income','Cost'), dat$V3, dat$V2)
  • 您还可以使用 dplyr/data.table
  • ifelse没有最好的表现。您也不能进行 NA 感知比较(即带有 NA 子句的三向选择)
于 2018-02-01T22:06:42.740 回答
1

数据表方式:

 result <- setDT(dat)[,result_col:= ifelse(V2 %in% c('Income','Cost'), V3, V2)]


> result

    V1                    V2            V3             result_col
1  Non Debt Balance   Average Balance  Trade         Average Balance
2  Non Debt Income       Income     Sales Finance     Sales Finance
3  Non Debt Cost          Cost         Trade             Trade
于 2018-02-01T22:17:57.557 回答