如何在R中重新组织这个data.frame
我有下面的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
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