R 如何将数据帧的列移动到前几列之后的行中?
我有一个数据框,每一行代表一系列学校R 如何将数据帧的列移动到前几列之后的行中?,r,dataframe,R,Dataframe,我有一个数据框,每一行代表一系列学校 edu <- read.table(header=TRUE, text="Elem Mid High e1 m1 h1 e2 m2 h2 e1 m2 h2 e3 m1 h1") 对于有向图(通过igraph包) 我是这样做的: e2m <- edu[,1:2] m2h <- edu[,2:3] colnames(e2m) <- c("s1", "s2") colnames(m2h) <- c("s1", "s2") schoo
edu <- read.table(header=TRUE, text="Elem Mid High
e1 m1 h1
e2 m2 h2
e1 m2 h2
e3 m1 h1")
对于有向图(通过igraph包)
我是这样做的:
e2m <- edu[,1:2]
m2h <- edu[,2:3]
colnames(e2m) <- c("s1", "s2")
colnames(m2h) <- c("s1", "s2")
schools <- rbind(e2m,m2e)
e2m这里有一个可能的解决方案:
len <- seq_along(edu)
a <- head(len, -1)
b <- tail(len, -1)
data.frame(s1=as.character(unlist(edu[, a])), s2=as.character(unlist(edu[, b])))
len直接将OP的代码转换为apply。这不是矢量化的:
do.call(rbind, lapply(seq(ncol(edu)-1), FUN=function(x){
r <- edu[,x:(x+1)]
colnames(r) <- c('s1', 's2')
r
}
))
do.call(rbind,lappy(seq)(ncol(edu)-1),FUN=function(x){
r具有矩阵输出的替代方案,如igraph
功能所接受
t(
matrix(
apply(edu,1,function(x) x[c(1,rep(2:(length(x)-1),each=2),length(x))]),
nrow=2
)
)
结果:
[,1] [,2]
[1,] "e1" "m1"
[2,] "m1" "h1"
[3,] "e2" "m2"
[4,] "m2" "h2"
[5,] "e1" "m2"
[6,] "m2" "h2"
[7,] "e3" "m1"
[8,] "m1" "h1"
并转换为图形:
> graph.edgelist(result)
IGRAPH DN-- 7 8 --
+ attr: name (v/c)
使用@Tyler的方法:
# assuming a new column added
edu$Uni <- as.factor(c("u1", "u2", "u1", "u1"))
#假设添加了新列
edu$Uni我可以说这是一个很好的问题,因为您(1)提出了一个问题,,(2)提供了一个小的工作数据集,,(3)显示所需的输出
,(4)你现在在做什么。
+1我对它的使用非常不熟练,但这不是melt
-recast
所做的吗?@Carl,我也这么认为,但情况并非如此,至少不是很简单。请注意,转换后的data.frame的第一列既有第一列,也有第二列fromedu
@Arun:谢谢。省去我编写代码的麻烦了。@Carl,melt | recast | merge也是我的想法,我也尝试过编写代码,结果以眼泪收场……All:谢谢你的输入。我用一个“统一”的数据帧尝试了所有的代码,它们都非常有效。我不知道选择哪一个…前两个不太正确(打印的组合太多了)。“Edit2”是正确的,非常棒。
# assuming a new column added
edu$Uni <- as.factor(c("u1", "u2", "u1", "u1"))
rows <- nrow(edu)
total <- prod(dim(edu)) # ie: nrow(edu) * ncol(edu)
X <- as.character(unlist(edu))
data.frame(s1=X[1:(total-rows)], s2=X[(rows+1):total])
s1 s2
1 e1 m1
2 e2 m2
3 e1 m2
4 e3 m1
5 m1 h1
6 m2 h2
7 m2 h2
8 m1 h1
9 h1 u1 <~~~ Added "Uni" column
10 h2 u2 <~~~ Added "Uni" column
11 h2 u1 <~~~ Added "Uni" column
12 h1 u1 <~~~ Added "Uni" column