如何在R

时间:2017-06-22 16:44:54

标签: 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     
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

4 个答案:

答案 0 :(得分:1)

您可以使用reshape()包中的stats功能。

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])

您还可以使用melt()

中的reshape2功能
#USING PREPROCESSED DF.NEW

df.new <- melt(df, id.vars = "u", na.rm = T)

答案 1 :(得分:0)

这是一个相当奇怪的数据结构,因为每个变量都是一个因子变量。第二种方法是使用tas.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))

现在,删除NA值

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

答案 2 :(得分:0)

这是一个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)

答案 3 :(得分:0)

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