我想将数据集的行转换为列。
selection weight
sel1 0.4
sel2 0.5
selection_1 weight_1 selection_2 weight_2
sel1 0.4 sel2 0.6
我尝试重塑形状,但不确定使用什么参数。
是否可以使用基本R函数进行此转换?
答案 0 :(得分:0)
据我所知,我认为您首先需要创建lmfit.Model
和library(sp)
library(tspmeta)
TSP225 <- read.csv("PLOT.csv")
coords.df <- data.frame(long=TSP225$Long, lat=TSP225$Lat)
coords.mx <- as.matrix(coords.df)
# Compute distance matrix
dist.mx <- dist(coords.mx)
# Construct a TSP object
tsp.ins <- tsp_instance(coords.mx, dist.mx )
#
tour <- run_solver(tsp.ins, method="2-opt")
#Plot
autoplot(tsp.ins, tour)
tour_length(tour)
才能使用timevar
。 (即使idvar
在这里是常量。)
reshape
您可以通过
取消选择idvar
df1_wide <- reshape(data = transform(df1,
timevar = seq_len(nrow(df1)),
idvar = 1L),
timevar = "timevar",
idvar = "idvar",
direction = "wide",
sep = "_")
df1_wide
# idvar selection_1 weight_1 selection_2 weight_2
#1 1 sel1 0.4 sel2 0.5
答案 1 :(得分:0)
这很麻烦,但是可以。
对于该示例,我将构建您描述的数据框:
selection <- c('sel1','sel2')
weight <- c(0.4,0.5)
df <- data.frame(selection = selection,weight = weight)
首先,请确保selection
变量是character
类型,而不是factor
。
df$selection <- as.character(df$selection)
要创建新数据框的名称列表,我们创建正确的字符串并将其粘贴到索引中。
indices <- sort(c(1:nrow(df),1:nrow(df)))
tags <- c(rbind(rep(names(df)[1],nrow(df)),rep(names(df)[2],nrow(df))))
new_names <- sapply(1:(2*nrow(df)),function(j) paste(tags[j],indices[j],sep="_"))
这是糊涂的部分,以函数形式编写。让我们一步一步地进行操作,然后将新变量添加到一个空数据框中。
make_new_df <- function(df) {
new_df <- data.frame()
for (i in (1:length(new_names))) {
test <- i %% ncol(df)
if (test == 0) {
row_index <- floor(i/ncol(df))
col_index <- ncol(df)
} else {
row_index <- floor(i/ncol(df))+1
col_index <- (i %% ncol(df))
}
new_df[1,new_names[i]] <- df[row_index,col_index]
}
return(new_df)
}
让我们检查一下它是否适用于您的示例:
> make_new_df(df)
selection_1 weight_1 selection_2 weight_2
1 sel1 0.4 sel2 0.5
函数make_new_df
将适用于具有任意行和列数的输入数据帧df
,但是它需要对new_names
进行正确的配置。初步代码构建new_names
可以用于任意数量的行,但只能用于两列(因此它在函数外部)。例如,代码
selection <- c('sel1','sel2','sel3','sel4')
weight <- c(0.4,0.5,0.6,0.7)
df <- data.frame(selection = selection,weight = weight)
indices <- sort(c(1:nrow(df),1:nrow(df)))
tags <- c(rbind(rep(names(df)[1],nrow(df)),rep(names(df)[2],nrow(df))))
new_names <- sapply(1:(2*nrow(df)),function(j) paste(tags[j],indices[j],sep="_"))
make_new_df(df)
产生
selection_1 weight_1 selection_2 weight_2 selection_3 weight_3 selection_4 weight_4
1 sel1 0.4 sel2 0.5 sel3 0.6 sel4 0.7