我有一个带有两位国家代码列的数据框。某些行可能包含多个代码。这是一个三行的小例子。
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"
。
答案 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
在“,”上的字符串,并使用if
和else
和return
相应的值来检查不同的条件。
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