R 使用NA'转换多个列;排成几行

R 使用NA'转换多个列;排成几行,r,merge,data-cleaning,R,Merge,Data Cleaning,我有一个大数据框架(约100列): 我想将其转换为以下数据帧: col1| merged_col1| -------------------- A 1 A 2 A 3 A 4 B 1 B 3 B 2 B 3 C 2 C 5 C 3 C 2 我想将省略所有NA的列合并到相应的行中。然后,我想将第一行以外的所有行转换为行。我怎样才

我有一个大数据框架(约100列):

我想将其转换为以下数据帧:

col1| merged_col1|
--------------------
 A       1
 A       2
 A       3 
 A       4
 B       1
 B       3
 B       2
 B       3
 C       2
 C       5
 C       3
 C       2

我想将省略所有NA的列合并到相应的行中。然后,我想将第一行以外的所有行转换为行。我怎样才能在R中做到这一点

For循环并不是在R中使用的最佳方法,但您可以尝试以下方法:

new.df <- data.frame()

index <- 1

for(i in 1:nrow(old.df)){
  for(j in 2:ncol(old.df)){
    if (!is.na(old.df[i,j])){
      new.df[index,1] <- old.df[i,1]
      new.df[index,2] <- old.df[i,j]
      index <- index + 1
    }
  }
}
new.df
库(tidyverse)
df%选择(-col)%%>%arrange(col1,合并的\u col1)

您可能需要
melt
库(data.table);melt(setDT(df1),id.var='col1',na.rm=TRUE)
谢谢@akrun。您的解决方案比为循环编写更有效。
new.df <- data.frame()

index <- 1

for(i in 1:nrow(old.df)){
  for(j in 2:ncol(old.df)){
    if (!is.na(old.df[i,j])){
      new.df[index,1] <- old.df[i,1]
      new.df[index,2] <- old.df[i,j]
      index <- index + 1
    }
  }
}
library(tidyverse)

df <- data.frame(col1 = c("A", "A", "B", "B", "C", "C"),
           col2 = c(1, 3, NA, NA, NA, NA),
           col3 = c(2, 4, NA, NA, NA, NA),
           col4 = c(NA, NA, 1, 2, NA, NA),
           col5 = c(NA, NA, 3, 3, NA, NA),
           col6 = c(NA, NA, NA, NA, 2, 3),
           col7 = c(NA, NA, NA, NA, 5, 2))

df_long <- df %>% gather(col, merged_col1, c(2:7), na.rm = T) %>% select(-col) %>% arrange(col1, merged_col1)