如何通过数字和字母将数据框中的列拆分为两列

时间:2014-04-09 19:29:41

标签: r split

为清晰起见编辑:我有一个名为“dat”的数据框,包含3列“Trial.Type”,“Affect”和“Reaction.Time”

前三行:

Trial.Type影响Reaction.Time

Aa,1 0 1231

Aa,2 1 1241

哈,1 1 1112

我想知道是否有办法拆分列“Trial.Type”,以便“Aa”和“1”是两列; Trial.Type和Intensity分别。导致具有4列的数据框。

非常感谢任何帮助。我很难找到这个问题的答案,如果这是一个重复,我道歉!

3 个答案:

答案 0 :(得分:3)

您可以在"栏中使用read.csv"。

> dat <- c("Aa, 1", "Aa, 2", "Ha, 1", "Hpa, 8")
> read.csv(text = dat, header=FALSE, col.names = c("Trial.Type", "Intensity"))
  Trial.Type Intensity
1         Aa         1
2         Aa         2
3         Ha         1
4        Hpa         8

替换&#34; dat&#34;使用您的列名称(例如,mydf$Trial.Type或可能as.character(mydf$Trial.Type))。

您还可以查看我的&#34; splitstackshape&#34;包,特别是concat.split函数组。


为了OP的好处,这是一个可重复的示例和解决方案,使用我的&#34; splitstackshape&#34;包。当然,这也可以使用基本R,使用上面描述的方法(或使用此处提到的strsplit方法之一)来完成。

首先,一些示例数据的列为character,另一列为factor

mydf <- data.frame(A = factor(c("1, Z", "2, Y", "3, X", "4, W")),
                   B = c("11, ZZ", "22, YY", "33, XX", "44, WW"),
                   C = c(123, 234, 345, 456), stringsAsFactors = FALSE)
mydf
#      A      B   C
# 1 1, Z 11, ZZ 123
# 2 2, Y 22, YY 234
# 3 3, X 33, XX 345
# 4 4, W 44, WW 456
str(mydf)
# 'data.frame':  4 obs. of  3 variables:
#  $ A: Factor w/ 4 levels "1, Z","2, Y",..: 1 2 3 4
#  $ B: chr  "11, ZZ" "22, YY" "33, XX" "44, WW"
#  $ C: num  123 234 345 456

其次,加载包并探索选项:

library(splitstackshape)
## Split a factor column
concat.split(mydf, split.col = "A", sep = ",")
#      A      B   C A_1 A_2
# 1 1, Z 11, ZZ 123   1   Z
# 2 2, Y 22, YY 234   2   Y
# 3 3, X 33, XX 345   3   X
# 4 4, W 44, WW 456   4   W

## Split a character column
concat.split(mydf, split.col = "B", sep = ",")
#      A      B   C B_1 B_2
# 1 1, Z 11, ZZ 123  11  ZZ
# 2 2, Y 22, YY 234  22  YY
# 3 3, X 33, XX 345  33  XX
# 4 4, W 44, WW 456  44  WW

## Split two columns in one go
concat.split.multiple(mydf, split.cols = c("A", "B"), seps = ",")
#     C A_1 A_2 B_1 B_2
# 1 123   1   Z  11  ZZ
# 2 234   2   Y  22  YY
# 3 345   3   X  33  XX
# 4 456   4   W  44  WW

答案 1 :(得分:2)

您可以使用strsplit

执行此操作
dat = c("Aa, 1", "Aa, 2", "Ha, 1", "Hpa, 8")
spl = strsplit(dat, ", ")
data.frame(Trial.Type = unlist(lapply(spl, "[", 1)),
           Intensity = as.numeric(unlist(lapply(spl, "[", 2))))
#   Trial.Type Intensity
# 1         Aa         1
# 2         Aa         2
# 3         Ha         1
# 4        Hpa         8

答案 2 :(得分:1)

您可以使用以下说明:

datNames <- names(dat)
dat <- cbind(t(matrix(unlist(strsplit(dat$Trial.type, ", ")),ncol=dim(dat)[1])))
names(dat) <- c(datNames,"Trial.type2","Intensity")