[英]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)
我該怎么做?
編輯 請注意 ,這是一個較大問題的最小示例,其中有許多可能的變量(不僅僅是cost
和reed_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.