通过模式匹配从列创建列

时间:2018-07-24 07:08:51

标签: r dataframe pattern-matching

我有一个带有两位国家代码列的数据框。某些行可能包含多个代码。这是一个三行的小例子。

df <- structure(list(ID =  c("US", "US, US","CA,CA,CA,MX,US,IN")), 
                .Names=c("ID"), row.names = c("1", "2", "3"), class = ("data.frame"))

我想基于column ID创建两列,如下所示:

df <- structure(list(ID         = c("US", "US, US","CA,CA,CA,MX,US,JP,IN"), 
                     all_US     = c(1,1,0), 
                     partial_US = c(0,0,1)), 
                     .Names     = c("ID", "all_us", "partial_us"),   row.names = c("1", "2","3"), class = ("data.frame"))
如果该行中至少有一个partial_US,则

1等于"US"

如果所有值均为all_US,则

1等于"US"

3 个答案:

答案 0 :(得分:2)

使用strsplit()

df$all_us <- sapply(
  strsplit(df$ID, ", ?"), 
  function(x) all(x == "US")
)
df$partial_us <- sapply(
  strsplit(df$ID, ", ?"), 
  function(x) !all(x == "US") && any(x == "US")
)
                 ID all_us partial_us
1                US   TRUE      FALSE
2            US, US   TRUE      FALSE
3 CA,CA,CA,MX,US,IN  FALSE       TRUE

然后,如果您希望将逻辑列转换为0/1,则可以转换为整数:

as.integer(df$all_us)
[1] 1 1 0

答案 1 :(得分:2)

您可以使用http.createServer(function (req, res) { if (req.url != '/favicon.ico') { // do your stuffs } }).listen(3500);

grepl

您可以按照以下步骤进行操作:

 df$all_us= +grepl("^(US[, ]*)+$", df$ID)

 df$partial_us = grepl("US",df$ID) - df$all_us
 df
                 ID all_us partial_us
1                US      1          0
2            US, US      1          0
3 CA,CA,CA,MX,US,IN      0          1

答案 2 :(得分:1)

使用strsplit,我们split在“,”上的字符串,并使用ifelsereturn相应的值来检查不同的条件。

df[c("all_us", "partial_us")] <- t(sapply(strsplit(df$ID, ","), function(x) {
     if (all(grepl("US", x)))
        return(c(1, 0))
     else if (any(grepl("US", x)))
        return(c(0, 1))
     return(c(0, 0))
}))

df

#                 ID all_us partial_us
#1                US      1          0
#2            US, US      1          0
#3 CA,CA,CA,MX,US,IN      0          1