dcast'ing 的公式 data.frame
Formula for dcast'ing a data.frame
我有一个 data.frame
和 colnames
:A01,A02,...,A25,...,Z01,...,Z25(总共 26*25)。例如:
set.seed(1)
df <- data.frame(matrix(rnorm(26*25),ncol=26*25,nrow=1))
cols <- c(paste("0",1:9,sep=""),10:25)
colnames(df) <- c(sapply(LETTERS,function(l) paste(l,cols,sep="")))
并且我想 dcast
它成为 26x25 的 data.frame
(行将为 A-Z,列为 01-25)。知道这个 dcast
的公式是什么吗?
删除列看起来不太好(仍在学习 data.table)。需要有人把它做得更好。
# convert to data.table
df <- data.table(df)
# melt all the columns first
test <- melt(df, measure.vars = names(df))
# split the original column name by letter
# paste the numbers together
# then remove the other columns
test[ , c("ch1", "ch2", "ch3") := tstrsplit(variable, "")][ , "ch2" :=
paste(ch2, ch3, sep = "")][ , c("ch3", "variable") := NULL]
# dcast with the letters (ch1) as rows and numbers (ch2) as columns
dcastOut <- dcast(test, ch1 ~ ch2 , value.var = "value")
然后只删除包含数字的第一列?
我们可以使用tidyverse
library(tidyverse)
res <- gather(df) %>%
group_by(key = sub("\D+", "", key)) %>%
mutate(n = row_number()) %>%
spread(key, value) %>%
select(-n)
dim(res)
#[1] 26 25
您要查找的 "formula" 可以来自 "data.table" 实现中的 patterns
参数 melt
. dcast
用于从 "long" 形式变为 "wide" 形式,而 melt
用于从宽形式变为长(呃)形式。 melt()
不使用 formula
方法。
基本上,您需要执行以下操作:
library(data.table)
setDT(df) ## convert to a data.table
cols <- sprintf("%02d", 1:25) ## Easier way for you to make cols in the future
melt(df, measure.vars = patterns(cols), variable.name = "ID")[, ID := LETTERS][]
我有一个 data.frame
和 colnames
:A01,A02,...,A25,...,Z01,...,Z25(总共 26*25)。例如:
set.seed(1)
df <- data.frame(matrix(rnorm(26*25),ncol=26*25,nrow=1))
cols <- c(paste("0",1:9,sep=""),10:25)
colnames(df) <- c(sapply(LETTERS,function(l) paste(l,cols,sep="")))
并且我想 dcast
它成为 26x25 的 data.frame
(行将为 A-Z,列为 01-25)。知道这个 dcast
的公式是什么吗?
删除列看起来不太好(仍在学习 data.table)。需要有人把它做得更好。
# convert to data.table
df <- data.table(df)
# melt all the columns first
test <- melt(df, measure.vars = names(df))
# split the original column name by letter
# paste the numbers together
# then remove the other columns
test[ , c("ch1", "ch2", "ch3") := tstrsplit(variable, "")][ , "ch2" :=
paste(ch2, ch3, sep = "")][ , c("ch3", "variable") := NULL]
# dcast with the letters (ch1) as rows and numbers (ch2) as columns
dcastOut <- dcast(test, ch1 ~ ch2 , value.var = "value")
然后只删除包含数字的第一列?
我们可以使用tidyverse
library(tidyverse)
res <- gather(df) %>%
group_by(key = sub("\D+", "", key)) %>%
mutate(n = row_number()) %>%
spread(key, value) %>%
select(-n)
dim(res)
#[1] 26 25
您要查找的 "formula" 可以来自 "data.table" 实现中的 patterns
参数 melt
. dcast
用于从 "long" 形式变为 "wide" 形式,而 melt
用于从宽形式变为长(呃)形式。 melt()
不使用 formula
方法。
基本上,您需要执行以下操作:
library(data.table)
setDT(df) ## convert to a data.table
cols <- sprintf("%02d", 1:25) ## Easier way for you to make cols in the future
melt(df, measure.vars = patterns(cols), variable.name = "ID")[, ID := LETTERS][]