2017-01-19 6 views
-2

Я создал фрейм данных, используя следующим:R: Как повторно конкатенация раздвоения строки в кадре данных

Student <- c("John Davis","Angela Williams","Bullwinkle Moose","David Jones", 
"Janice Markhammer","Cheryl Cushing","Reuven Ytzrhak","Greg Knox","Joel England", 
"Mary Rayburn") 
Math <- c(502,600,412,358,495,512,410,625,573,522) 
Science <- c(95,99,80,82,75,85,80,95,89,86) 
English <- c(25,22,18,15,20,28,15,30,27,18) 
student.exam.data <- data.frame(Student,Math,Science,English) 

я затем разделить «Джон Дэвис» через student.exam.data$Student[1] <- strsplit(as.character(student.exam.data$Student[1]), " ", fixed = FALSE) в c("John", "Davis").

Я сейчас пытаюсь повторно объединить двух персонажей в одну строку «Джон Дэвис». Я пробовал paste(student.exam.data$Student[1], collapse = " "), paste(as.vector(student.exam.data$Student[1]), collapse = " ") и toString(student.exam.data$Student[1]). Все три возвращения "c(\"John\", \"Davis\")".

Во-первых, почему они возвращают обратную косую черту, а во-вторых, каким будет подходящий способ приблизиться к этому?

ответ

0

Проблема заключается в том, что линия

student.exam.data$Student[1] <- strsplit(as.character(student.exam.data$Student[1]), " ", fixed = FALSE) 

Превращает первую переменную в вашем dataframe в список ---

str(student.exam.data) 
'data.frame': 10 obs. of 4 variables: 
$ Student:List of 10 
..$ : chr "John" "Davis" 
..$ : chr "Angela Williams" 
..$ : chr "Bullwinkle Moose" 
..$ : chr "David Jones" 
..$ : chr "Janice Markhammer" 
..$ : chr "Cheryl Cushing" 
..$ : chr "Reuven Ytzrhak" 
..$ : chr "Greg Knox" 
..$ : chr "Joel England" 
..$ : chr "Mary Rayburn" 
$ Math : num 502 600 412 358 495 512 410 625 573 522 
$ Science: num 95 99 80 82 75 85 80 95 89 86 
$ English: num 25 22 18 15 20 28 15 30 27 18 

В качестве такого первого элемента имеет два значения. Это работает рекомбинировать в буквальном смысле, отвечая на ваш вопрос -

student.exam.data$Student[1]<-paste(student.exam.data$Student[1][[1]],student.exam.data$Student[1][[2]]) 

Что он не делает это исправить тот факт, что ваш первый переменный до сих пор список.

1

Возможно, вам будет удобно пользоваться tidyr::separate() и unite().

Пример:

library(tidyr) 

student.exam.data %>% separate(Student, c('first_name','last_name')) -> d2 

head(d2,3) 

возвращается:

first_name last_name Math Science English 
1  John  Davis 502  95  25 
2  Angela Williams 600  99  22 
3 Bullwinkle  Moose 412  80  18 

аналогичным образом:

d2 %>% unite('full_name', first_name, last_name, sep=' ') -> d3 

head(d3, 3) 

возвращает:

  full_name Math Science English 
1  John Davis 502  95  25 
2 Angela Williams 600  99  22 
3 Bullwinkle Moose 412  80  18