2017-04-03 58 views
2

下面我要試圖表現的形式重現如何RBind第4列以上一個與其他標籤

`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))` 

在這裏,我想rbind上述對方每4列一個與標籤無沿。列的數目總是可以被4整除。我在這裏也附上一張圖片以獲得清晰的圖片,結果應該是預期的。

預期輸出: enter image description here

+0

我不確定rbind是否是正確的解決方案,因爲按位置綁定不是很好的建議。你可以嘗試像融化一樣stg有一個列變量和一個列號,修改變量名稱,然後使用dcast以正確的格式重塑它。這樣你就不會使用位置,你的代碼更可靠。 – YCR

+0

@ bc004346 @YCR @KoenV只是想讓代碼更適合於任何數量的列RBinding,假設說'如果我想要通過N的N列沒有列並且N可以是從1到10的任何數字'。所以我們可以爲此提供了高效的代碼。 –

回答

0

我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 
+0

我很感謝你的解決方案先生,這個代碼將用於閃亮的應用程序,其中用戶將上傳一些.csv文件和「列數不固定」,它不是'只有列的數量不會是'它可以是隨機可由5或4或8整除。 –

+0

我的榮幸。隨意將此代碼標記爲正在工作,或標記爲「已選擇的解決方案」。 – KoenV

0

試試這個
它比以前的答案更令人費解的一點,但它應該是更適用於其他數據幀

# 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) 

尼爾斯

+0

我很感謝你的解決方案這段代碼只有在列名包含數字時才起作用,如果是字母則不會。 –

0

熔體和重塑方式:

它意味着每行得到一個標識符:

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") 
相關問題