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整除。我的荣幸。请随意将此代码标记为工作,或标记为“选择的解决方案”。