R 如何使用标记将前4列一列一列地标记在另一列之上
下面我试图以可代表性的形式再现R 如何使用标记将前4列一列一列地标记在另一列之上,r,R,下面我试图以可代表性的形式再现 `v<- data.frame(C1TEMP = c(3,6,1,8,9,2,2,9,1,23), C1VIB = c(5,6,1,8,9,2,2,9,1,23), C1DE = c(9,6,1,8,9,2,2,9,1,23), C1NDE = c(8,6,1,8,9,2,2,9,1,23), C2TEMP = c(5,6,1,8,9,
`v<- data.frame(C1TEMP = c(3,6,1,8,9,2,2,9,1,23),
C1VIB = c(5,6,1,8,9,2,2,9,1,23),
C1DE = c(9,6,1,8,9,2,2,9,1,23),
C1NDE = c(8,6,1,8,9,2,2,9,1,23),
C2TEMP = c(5,6,1,8,9,2,2,9,1,23),
C2VIB = c(378,6,1,8,9,2,2,9,1,23),
C2DE = c(3,78,1,8,9,2,2,9,1,23),
C2NDE = c(3,6,1,8,9,2,2,9,1,23),
C3TEMP= c(3,6,89,8,9,2,2,9,1,23),
C3VIB = c(3,6,1,98,9,2,2,9,1,23),
C3DE = c(33,56,91,82,99,12,22,19,81,23),
C3NDE = c(13,76,91,88,59,42,22,39,21,23))`
`v我同意YCR的评论。不过,这是一种解决问题的方法。使用以下代码:
# data frames need column headers, so convert to matrix
v01 <- as.matrix(v[, 1:4])
v02 <- as.matrix(v[, 5:8])
v03 <- as.matrix(v[, 9:12])
# remove columnnames
colnames(v01) <- NULL
colnames(v02) <- NULL
colnames(v03) <- NULL
# now you can use rbind and give the columnnames back
v2 <- rbind( v01, v02, v03)
colnames(v2) <- c("C1TEMP", "C1VIB", "C1DE", "C1NDE")
v2
#数据帧需要列标题,因此转换为矩阵
v01试试这个
它比以前的答案要复杂一些,但它应该更适合于其他数据帧
# how many blocks have you got?
howMany <-table(gsub(names(v),pattern = "[0-9]",replacement = ""))[1]
# make a common name string
NAMES <- unique(gsub(names(v),pattern = "[0-9]",replacement = ""))
# create a list
list() -> V
for(i in 1:howMany){
# get the column with matching index number
v[,grep(names(v),pattern = i)] -> vi
names(vi) <- NAMES# change name
data.frame(Tag=i,vi) -> V[[i]]# put it in the list
}
# combine tables in the list into one list
do.call(rbind,V)
#你有多少个街区?
有多少人
姓名(vi)V[[i]#将其列入清单
}
#将列表中的表合并到一个列表中
do.呼叫(rbind,V)
零熔化和重塑方式:
它意味着每行获取一个标识符:
v<- data.frame(C1TEMP = c(3,6,1,8,9,2,2,9,1,23),
C1VIB = c(5,6,1,8,9,2,2,9,1,23),
C1DE = c(9,6,1,8,9,2,2,9,1,23),
C1NDE = c(8,6,1,8,9,2,2,9,1,23),
C2TEMP = c(5,6,1,8,9,2,2,9,1,23),
C2VIB = c(378,6,1,8,9,2,2,9,1,23),
C2DE = c(3,78,1,8,9,2,2,9,1,23),
C2NDE = c(3,6,1,8,9,2,2,9,1,23),
C3TEMP= c(3,6,89,8,9,2,2,9,1,23),
C3VIB = c(3,6,1,98,9,2,2,9,1,23),
C3DE = c(33,56,91,82,99,12,22,19,81,23),
C3NDE = c(13,76,91,88,59,42,22,39,21,23),
id = 1:10
, stringsAsFactors = F)
library(tidyverse)
# melt the dataframe(reshape from wide to long format):
v_melt <- reshape2::melt(v, id.vars = "id")
# modify the aggregation variables
v_melt <- v_melt %>%
mutate(var = substr(as.character(variable), 3, 8),
group_id = paste0(substr(as.character(variable), 1, 2), "_", id))
# reshape the data frame in a wide format:
v_cast <- reshape2::dcast(v_melt, group_id ~ var, value.var = "value")
vI我不确定rbind是正确的解决方案,因为不建议按位置绑定。您可以尝试使用stg-like-melt来拥有一个列变量和一个列编号,修改变量名,然后使用dcast以正确的格式对其进行重塑。这样,您就不用使用position,您的代码也更可靠。@bc004346@YCR@KoenV只是一个让代码更适合任何数量的列的想法,比如说,如果我想用N表示N列的编号&N可以是1到10之间的任何数字
。那么我们可以有有效的代码来实现这一点。我很感激你的解决方案。这段代码只在列名包含数字时才有效,如果是字母,则不会。我很感激你的解决方案,先生,此代码将用于闪亮的应用程序中,用户将上载一些.csv文件,列数不固定
这不是强制要求,列数将仅为4
它可以是随机的,但可以被5、4或8整除。我的荣幸。请随意将此代码标记为工作,或标记为“选择的解决方案”。