3

我有一个这样的数据框:

X <- data.frame(value = c(1,2,3,4), 
                variable = c("cost", "cost", "reed_cost", "reed_cost"))

我想将变量列一分为二;一列表示变量是否为“成本”,另一列表示变量是否为“reed”。我似乎无法为拆分找出正确的正则表达式(例如使用 tidyr)

如果我的数据更好,请说:

Y <- data.frame(value = c(1,2,3,4), 
                variable = c("adjusted_cost", "adjusted_cost", "reed_cost", "reed_cost"))

那么这对于 tidyr 来说是微不足道的:

separate(Y, variable, c("Type", "Model"), "_")

和宾果游戏。相反,看起来我需要某种条件语句来拆分“_”(如果存在),否则拆分在模式的开头(“^”)。

我试过了:

separate(X, variable, c("Policy-cost", "Reed"), "(?(_)_|^)", perl=TRUE)

但没有运气。我意识到我什至无法成功拆分为空字符串:

separate(X, variable, c("Policy-cost", "Reed"), "^", perl=TRUE)

我该怎么做?

编辑 请注意,这是一个更大问题的最小示例,其中有许多可能的变量(不仅仅是costand reed_cost),所以我不想对每个变量进行字符串匹配。

我正在寻找一种解决方案,该解决方案可以按_模式拆分任意变量(如果存在),否则将它们拆分为空白字符串和原始标签。

我也意识到我可以只是 grep 的存在,_然后手动构建列。如果不那么优雅,那也没关系;似乎应该有一种方法可以使用可以返回空字符串的条件来拆分字符串...

4

3 回答 3

1

使用基础 R 的另一种方法:

cbind(X["value"], 
      setNames(as.data.frame(t(sapply(strsplit(as.character(X$variable), "_"), 
                                      function(x) 
                                        if (length(x) == 1) c("", x) 
                                        else x))), 
               c("Policy-cost", "Reed")))

#   value Policy-cost Reed
# 1     1             cost
# 2     2             cost
# 3     3        reed cost
# 4     4        reed cost
于 2014-07-26T11:01:59.303 回答
1

你可以试试:

X$variable <- ifelse(!grepl("_", X$variable), paste0("_", X$variable), as.character(X$variable))

 separate(X, variable, c("Policy-cost", "Reed"), "_")
 # value Policy-cost Reed
 #1     1             cost
 #2     2             cost
 #3     3        reed cost
 #4     4        reed cost

或者

X$variable <-  gsub("\\b(?=[A-Za-z]+\\b)", "_", X$variable, perl=T)
 X$variable
#[1] "_cost"     "_cost"     "reed_cost" "reed_cost"

 separate(X, variable, c("Policy-cost", "Reed"), "_")

解释

\\b(?=[A-Za-z]+\\b): 匹配一个单词边界\\b并向前查找字符,然后是单词边界。第三个和第四个元素不匹配,所以没有被替换。

于 2014-07-24T18:05:03.633 回答
1

假设您可能有也可能没有分隔符,并且 cost 和 reed 不一定是互斥的,为什么不搜索特定的字符串而不是分隔符呢?

例子:

library(stringr)
X <- data.frame(value = c(1,2,3,4), 
                variable = c("cost", "cost", "reed_cost", "reed_cost"))
X$cost <- str_detect(X$variable,"cost")
X$reed <- str_detect(X$variable,"reed") 
于 2014-07-24T17:32:43.453 回答