2017-06-22 5 views
2

私は以下のdata.frameを持っています。このdata.frameをR組織に再編成するには

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 
+0

値ドロップで溶融機能に依存しない特定の理由がありますreshape2パッケージ?あなたはそれを正確に、すなわち広いものから長いものに与えるべきです。または私は誤読ですか? –

答えて

1

あなたはstatsパッケージにreshape()機能を使用することができます。

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

また、すべての変数は、因子変数であるので、これは、かなり奇妙なデータ構造であるreshape2

#USING PREPROCESSED DF.NEW 

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

melt()機能を使用することができます。第2の方法は、第2の変数にtおよびas.integerおよびrepを使用して、所望のdata.frameの2つのベクトルを明示的に構築することである。今

# 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 
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) 
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 
関連する問題