如何在R中重新组织这个data.frame

如何在R中重新组织这个data.frame,r,R,我有下面的data.frame u = c("aa", "bb", "cc", "dd") v = c(1, 6, 9, 10) w = c(2, 7, "", 11) x = c(3, 8, "", 12) y = c(4, "", "", 13) z = c(5, "", "", "") df = data.frame(cbind(u, v, w, x, y, z)) df u v w x y z 1 aa 1 2 3 4 5 2 bb 6 7 8

我有下面的data.frame

u = c("aa", "bb", "cc", "dd") 
v = c(1, 6, 9, 10) 
w = c(2, 7, "", 11) 
x = c(3, 8, "", 12)
y = c(4, "", "", 13)
z = c(5, "", "", "")
df = data.frame(cbind(u, v, w, x, y, z))
df

   u  v  w  x  y z
1 aa  1  2  3  4 5
2 bb  6  7  8     
3 cc  9           
4 dd 10 11 12 13
我想把最终产品重新组织成这样

1 aa
2 aa
3 aa
4 aa
5 aa
6 bb
7 bb
8 bb
9 cc
10 dd
11 dd
12 dd
13 dd
14 dd
我已经准备好了下面的脚本,但是我遗漏了一些东西。我希望你能给我提供一些指导

dat <- df[,-1]
dat <- dat[,!apply (is.na(dat), 2, all)]
dat[is.na(dat)]="|"
dat <- apply(dat, 1, paste, collapse="|")
dat <- gsub("\\|\\|","", dat)
dat <- trimws(gsub("\\|$","",dat))
all.dat <- unlist(strsplit(dat,"\\|"))
dat.tmp <- data.frame(matrix(ncol = 2, nrow = length(all.dat)))
col1 <- df[,1]

for(i in 1:length(dat)){
  tmp <- dat[i]
  tmp <- unlist(strsplit(tmp, "\\|"))
  for(j in 1:length(tmp)){
    dat.tmp[i,1] <- tmp[j]
    dat.tmp[i,2] <- as.character(col1[i])
  }
  print(i)
}
dat.tmp

dat您可以使用
stats
包中的
restrape()
函数

df     <- sapply(df, as.character) #PRE-PROCESS DATA
df[df == ""] <- NA #PRE-PROCESS DATA    

df.new <- reshape(df, idvar = "u", direction = "long", varying = list(2:dim(df)[2]), 
                  v.names = "vars")
df.new <- df.new[!is.na(df$vars), ]
rownames(df.new) <- seq(1, df.new[1])

这是一个相当奇怪的数据结构,因为每个变量都是一个因子变量。第二种方法是使用第二个变量的
t
as.integer
rep
显式构造所需data.frame的两个向量

# transpose numeric values and convert to integer vector. repeat categorical
dat <- data.frame(val=as.integer(t(df[-1])), cat=rep(df[,1], each=ncol(df)-1L))
#转换数值并转换为整数向量。重复分类

dat这是dplyr/tidyr解决方案

library(dplyr)
library(tidyr)

df[] <- lapply(df, gsub, pattern = "^$|^ $", replacement = NA)

df <- gather(df, id, value, v:z, na.rm = TRUE) %>%
      arrange(u) %>%
      select(u)
库(dplyr)
图书馆(tidyr)
df[]%
选择(u)

ind是否有特定原因不依赖重塑2包中的熔化功能?应该给你从宽到长的正确答案。还是我误读了?
dat <- dat[!is.na(dat$val),]
dat
   val cat
1    1  aa
2    2  aa
3    3  aa
4    4  aa
5    5  aa
6    6  bb
7    7  bb
8    8  bb
11   9  cc
16  10  dd
17  11  dd
18  12  dd
19  13  dd
library(dplyr)
library(tidyr)

df[] <- lapply(df, gsub, pattern = "^$|^ $", replacement = NA)

df <- gather(df, id, value, v:z, na.rm = TRUE) %>%
      arrange(u) %>%
      select(u)
ind <- apply(df, 1, function(x) sum(!is.na(as.numeric(x[-1]))))
as.data.frame(rep(df$u, ind))

1              aa
2              aa
3              aa
4              aa
5              aa
6              bb
7              bb
8              bb
9              cc
10             dd
11             dd
12             dd
13             dd