我使用以下方法创建了一个数据框:
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)
然后我分裂了约翰戴维斯&#34;通过student.exam.data$Student[1] <- strsplit(as.character(student.exam.data$Student[1]), " ", fixed = FALSE)
进入c("John", "Davis")
。
我现在正试图将这两个角色重新连接成一个单一的#22; John Davis&#34;串。我们尝试过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 :(得分:1)
问题在于行
student.exam.data$Student[1] <- strsplit(as.character(student.exam.data$Student[1]), " ", fixed = FALSE)
将数据框中的第一个变量转换为列表---
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 :(得分: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