且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何根据多列的多个条件创建新列?

更新时间:2021-12-25 03:26:35

我们可以在%中使用%来比较列中的多个元素,& 来检查两个条件是否都有是真的。

We can use %in% for comparing multiple elements in a column, & to check if both conditions are TRUE.

library(dplyr)
df %>%
     mutate(get.flyer = c("", "Yes")[(commute %in% c("walk", "bike", "subway", "ferry") & 
           as.character(kids) == "Yes" & 
           as.numeric(as.character(distance)) < 10)+1] )






***是使用 stringsAsFactors = FALSE 创建 data.frame ,因为默认情况下它是 TRUE 。如果我们检查 str(df),我们可以发现所有列都是 factor class。此外,如果缺少值,而不是,可以使用 NA 来避免转换 class 一个数字列到其他地方。


It is better to create the data.frame with stringsAsFactors=FALSE as by default it is TRUE. If we check the str(df), we can find that all the columns are factor class. Also, if there are missing values, instead of "", NA can be used to avoid converting the class of a numeric column to something else.

如果我们改写创建'df'

If we rewrite the creation of 'df'

distance <- c(1, 12, 5, 25, 7, 2, NA, 8, 19, 7, NA, 4, 16, 12, 7)
df1 <- data.frame(commute, kids, distance, stringsAsFactors=FALSE)

以上代码可以简化

df1 %>%
    mutate(get.flyer = c("", "Yes")[(commute %in% c("walk", "bike", "subway", "ferry") &
        kids == "Yes" &
        distance < 10)+1] )

为了更好地理解,有些人更喜欢 ifelse

For better understanding, some people prefer ifelse

df1 %>% 
   mutate(get.flyer = ifelse(commute %in% c("walk", "bike", "subway", "ferry") & 
                kids == "Yes" &
                distance < 10, 
                          "Yes", ""))

这也可以通过轻松完成base R methods

This can be also done easily with base R methods

df1$get.flyer <- with(df1, ifelse(commute %in% c("walk", "bike", "subway", "ferry") & 
              kids == "Yes" & 
              distance < 10, 
                       "Yes", ""))