I have a df that looks like the on the left. I would like to put all rows inputs into one row,and still keep old rows. How should I do this?
df<-structure(list(c1 = c("Student Enrollment", "750"), c2 = c("Faculty Number",
"21"), c3 = c("Graduated", "65")), row.names = c(NA, -2L), class = c("tbl_df",
"tbl", "data.frame"))
CodePudding user response:
output = rbind(df, lapply(df, paste, collapse = "\n"))
output
# c1 c2 c3
# 1 Student Enrollment Faculty Number Graduated
# 2 750 21 65
# 3 Student Enrollment\n750 Faculty Number\n21 Graduated\n65
In the console, line breaks print as \n. If you View() it they will print as spaces. There are probably some nice table formatting packages that actually display linebreaks within a cell.
You could, of course, replace "\n" in my code with " " to use a space instead of a linebreak.
CodePudding user response:
A base solution similar to @GregorThomas':
rbind(df, do.call(paste, c(asplit(df, 1), sep = "\n")))
# A tibble: 3 × 3
c1 c2 c3
<chr> <chr> <chr>
1 "Student Enrollment" "Faculty Number" "Graduated"
2 "750" "21" "65"
3 "Student Enrollment\n750" "Faculty Number\n21" "Graduated\n65"
If you write the data out to an excel file (e.g. openxlsx::write.xlsx), \n will be presented as linebreaks.
CodePudding user response:
A possible solution is below. In case we need to have the concatenated number in a different line, we can use collapse = "\n" instead:
library(tidyverse)
bind_rows(df, map_dfr(df, ~ str_c(.x, collapse = " ")))
#> # A tibble: 3 × 3
#> c1 c2 c3
#> <chr> <chr> <chr>
#> 1 Student Enrollment Faculty Number Graduated
#> 2 750 21 65
#> 3 Student Enrollment 750 Faculty Number 21 Graduated 65
CodePudding user response:
We could use summarise with across
library(stringr)
library(dplyr)
df %>%
summarise(across(everything(), ~ c(.x, str_c(.x, collapse = " "))))
-output
# A tibble: 3 × 3
c1 c2 c3
<chr> <chr> <chr>
1 Student Enrollment Faculty Number Graduated
2 750 21 65
3 Student Enrollment 750 Faculty Number 21 Graduated 65

