在某些宽格式数据上使用melt
后,我在R中有以下数据框:
Condition value
C1SSC 4.5
C2SSC 7.7
TC1SSC 6.0
TC2SSC 7.3
PC1SSC 4.5
PC2SSC 5.7
每个字符或子字符串都有特定的含义(例如,TC2SSC表示用双眼观察纹理[T]圆[C]的条件[2],响应'起始形状'是圆[SSC] ])。
我想要做的是生成依赖于这些字符和子字符串的新变量列 - 一个用于纹理,一个用于形状,依此类推。我考虑使用grepl
或substr
,但我不确定这些是否可以评估字符串的特定部分(即在确定形状时,检查前两个字符以查看它们是否包含'C' )。
理想情况下,这就是我最终得到的结果(例如TC2SSC):
Texture Shape View startShape value
T Circle 2 Circle 4.5
有很多有用的功能,但我不确定哪种功能最好用。任何建议都将不胜感激。
答案 0 :(得分:2)
这是解决问题的直接方法。基本上,使用带有gsub
的模式在要“分割”的每个字符(此处为“_”)之后插入一个字符,然后在其上使用strsplit
。方法如下:
split.df <- data.frame(do.call(rbind, strsplit(gsub("(C|SSC|[0-9]+)", "_\\1_",
dt$Condition), "[_]+")), stringsAsFactors=FALSE)
# X1 X2 X3 X4
# 1 C 1 SSC
# 2 C 2 SSC
# 3 T C 1 SSC
# 4 T C 2 SSC
# 5 P C 1 SSC
# 6 P C 2 SSC
现在,其余部分非常简单(更改名称,转换类并将C替换为圆形等)。
names(split.df) <- c("Texture", "Shape", "View", "startShape")
split.df <- within(split.df, { Shape[Shape == "C"] <- "Circle"
View <- as.numeric(View)
startShape[startShape == "SSC"] <- "Circle"} )
cbind(split.df, value = df$value)
# Texture Shape View startShape df$value
# 1 Circle 1 Circle 4.5
# 2 Circle 2 Circle 7.7
# 3 T Circle 1 Circle 6.0
# 4 T Circle 2 Circle 7.3
# 5 P Circle 1 Circle 4.5
# 6 P Circle 2 Circle 5.7