То, что вы делаете, кажется невероятно глупым - зачем записывать что-то в CSV, чтобы снова прочитать?- но, учитывая, что df2
- это примерно , как вы хотите, вам нужно unlist()
три компонента в df2
и преобразовать их обратно как фрейм данных.
out <- data.frame(lapply(df2, function(x) factor(unlist(x))))
Это дает нам:
> out
V1 models cores
1 xxx aa c1
2 yyy aa c1
3 xxx aa c2
4 zzz aa c2
5 www aa c3
6 xxx aa c4
7 vvv aa c4
8 vvv bb c1
9 www bb c1
10 www bb c2
11 qqq bb c2
12 xxx bb c3
13 uuu bb c3
14 uuu bb c4
> str(out)
'data.frame': 14 obs. of 3 variables:
$ V1 : Factor w/ 7 levels "qqq","uuu","vvv",..: 5 6 5 7 4 5 3 3 4 4 ...
$ models: Factor w/ 2 levels "aa","bb": 1 1 1 1 1 1 1 2 2 2 ...
$ cores : Factor w/ 4 levels "c1","c2","c3",..: 1 1 2 2 3 4 4 1 1 2 ...
Который можно прочитать и повторить:
> write.csv(out, file="out.csv", row.names = FALSE)
> read.csv("out.csv")
V1 models cores
1 xxx aa c1
2 yyy aa c1
3 xxx aa c2
4 zzz aa c2
5 www aa c3
6 xxx aa c4
7 vvv aa c4
8 vvv bb c1
9 www bb c1
10 www bb c2
11 qqq bb c2
12 xxx bb c3
13 uuu bb c3
14 uuu bb c4
Обновление: Было бы проще перейти прямо отx
к желаемому выходу вместо чтения его в CSV и повторного ввода и последующей обработки y
.Например, это идет от x
непосредственно к тому же результату, что и out
сверху:
V1 <- with(x, strsplit(as.character(time), "\\|"))
lens <- lapply(V1, length)
out2 <- data.frame(V1 = factor(unlist(V1)),
models = with(x, rep(models, times = lens)),
cores = with(x, rep(cores, times = lens)))
, что дает:
> out2
V1 models cores
1 xxx aa c1
2 yyy aa c1
3 xxx aa c2
4 zzz aa c2
5 www aa c3
6 xxx aa c4
7 vvv aa c4
8 vvv bb c1
9 www bb c1
10 www bb c2
11 qqq bb c2
12 xxx bb c3
13 uuu bb c3
14 uuu bb c4
> str(out2)
'data.frame': 14 obs. of 3 variables:
$ V1 : Factor w/ 7 levels "qqq","uuu","vvv",..: 5 6 5 7 4 5 3 3 4 4 ...
$ models: Factor w/ 2 levels "aa","bb": 1 1 1 1 1 1 1 2 2 2 ...
$ cores : Factor w/ 4 levels "c1","c2","c3",..: 1 1 2 2 3 4 4 1 1 2 ...
> all.equal(out, out2)
[1] TRUE
В стороне: Кроме того, мы не можем легко вставить ваш код, поскольку вы только что скопировали его из консоли R, поэтому он включает подсказки (+
).Вместо этого вы могли бы сделать dput(x)
и вставить это в свой Q:
structure(list(models = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L), .Label = c("aa", "bb"), class = "factor"), cores = structure(c(1L,
2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("c1", "c2", "c3", "c4"
), class = "factor"), time = structure(c(7L, 8L, 3L, 6L, 2L,
4L, 5L, 1L), .Label = c("uuu", "vvv|www", "www", "www|qqq", "xxx|uuu",
"xxx|vvv", "xxx|yyy", "xxx|zzz"), class = "factor")), .Names = c("models",
"cores", "time"), class = "data.frame", row.names = c(NA, -8L
))
, тогда мы все могли бы просто сделать:
x <- structure(list(models = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L), .Label = c("aa", "bb"), class = "factor"), cores = structure(c(1L,
2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("c1", "c2", "c3", "c4"
), class = "factor"), time = structure(c(7L, 8L, 3L, 6L, 2L,
4L, 5L, 1L), .Label = c("uuu", "vvv|www", "www", "www|qqq", "xxx|uuu",
"xxx|vvv", "xxx|yyy", "xxx|zzz"), class = "factor")), .Names = c("models",
"cores", "time"), class = "data.frame", row.names = c(NA, -8L
))
То же самое с призывом к созданию df2
,Это было бы предпочтительнее:
write.csv(x, file="x.csv")
y <- read.csv(file="x.csv", header=TRUE, stringsAsFactors=FALSE)
df2 <- data.frame(
t(do.call(cbind,
lapply(1:nrow(y),function(x){
sapply(unlist(strsplit(y[x,4],"\\|")),c,y[x,2:3],
USE.NAMES=FALSE)
}))))
Таким образом, нам будет просто восстановить, какие у вас объекты и что вы пробовали.