1

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])。

我想要做的是生成新的变量列,这些列依赖于这些字符和子字符串——一个用于纹理,一个用于形状等等。我考虑过使用greplor substr,但我不确定它们是否可以评估字符串的特定部分(即在确定形状时,检查前两个字符以查看它们是否包含“C”)。

理想情况下,这就是我最终的结果(TC2SSC 的示例):

Texture    Shape    View    startShape    value
T          Circle   2       Circle        4.5

有很多有用的功能,但我不确定这里最好使用哪个。任何建议将不胜感激。

4

1 回答 1

2

这是解决问题的直接方法。基本上,使用模式 withgsub在要“拆分”的每个字符(此处为“_”)之后插入一个字符,然后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
于 2013-04-10T15:28:52.267 回答