R:如何在数据框中重新连接拆分字符串

时间:2017-01-19 21:19:25

标签: r split concatenation

我使用以下方法创建了一个数据框:

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\")"

首先,为什么这些会返回反斜杠,其次,什么是适当的方法来解决这个问题?

2 个答案:

答案 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