Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
209 views
in Technique[技术] by (71.8m points)

Native way to combine dataframe vectors in R

I want to combine a few dataframe vectors into a single one. Usually I would use a series of loops or something to acheive this, but I'm wondering if there is a more native way to do this in R?

Here is a sample of data that I currently have:

| A | B | C | other_data |
|------------------------|
| X |   |   | "foo"      |
|------------------------|
|   |   | X | "bar"      |
|------------------------|
|   | X |   | "baz"      |
|------------------------|
| X |   |   | ":)"       |
--------------------------

a <- c("X", NA, NA, "X")
b <- c(NA, NA, "X", NA)
c <- c(NA, "X", NA, NA)
other_data <- c("foo", "bar", "baz", ":)")
df <- data.frame(a, b, c, other_data)

And I would like to combine the A, B and C vectors into the one vector, like shown below:

| Alphabet | other_data |
|-----------------------|
|    "A"   | "foo"      |
|-----------------------|
|    "C"   | "bar"      |
|-----------------------|
|    "B"   | "baz"      |
|-----------------------|
|    "A"   | ":)"       |
-------------------------

Alphabet <- c("A","C","B","A")
other_data <- c("foo", "bar", "baz", ":)")
df <- data.frame(Alphabet, other_data)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can reshape the data to long format dropping NA values.

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols = a:c, 
               values_drop_na = TRUE, names_to = 'Alphabet') %>%
  select(-value)

# other_data Alphabet
#  <chr>      <chr>   
#1 foo        a       
#2 bar        c       
#3 baz        b       
#4 :)         a       

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...