簡體   English   中英

R中的條件字符串拆分(使用tidyr)

[英]conditional string splitting in R (using tidyr)

我有一個這樣的數據框:

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

我想把變量列分成兩部分; 一列表示變量是否為“成本”,另一列表示變量是否為“簧片”。 我似乎無法找出合適的正則表達式(例如使用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)

我該怎么做?

編輯 請注意 ,這是一個較大問題的最小示例,其中有許多可能的變量(不僅僅是costreed_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") 

你可以嘗試:

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並向前看字符后跟字邊界。 第三和第四個元素不匹配,因此沒有被替換。

基礎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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM