2017-02-23 21 views
1

我有一個數據集這樣串聯的行和列

 x y z 
     a 5 4 
     b 1 2 

,我想CONCAT列和行:

ay 5 
az 4 
by 1 
bz 2 

感謝

+0

@Sotos對不起,我更新了我的文章! – RMteam

回答

1

您可以使用melt,並paste但你將需要使你的rownames變量,我..

df$new <- rownames(df) 
m_df <- reshape2::melt(df) 
rownames(m_df) <- paste0(m_df$new, m_df$variable) 
m_df <- m_df[-c(1:2)] 

m_df 
# value 
#ax  5 
#bx  1 
#ay  4 
#by  2 
#az  3 
#bz  1 

你的編輯後,您不需要rownames轉換爲一個變量,以便公正,

m1_df <- reshape2::melt(df) 
m1_df$new <- paste0(m1_df$x, m1_df$variable) 

m1_df 
# x variable value new 
#1 a  y  5 ay 
#2 b  y  1 by 
#3 a  z  4 az 
#4 b  z  2 bz 

然後,您可以整理你的數據幀所需的輸出

0
library(reshape2) 
library(dplyr) 
library(tibble) 
library(stringr) 

# Create dataframe 
x <- data.frame(x = c(5, 1), 
       y = c(4, 2), 
       z = c(3, 1), 
       row.names = c('a', 'b')) 

# Convert rowname to column and melt 
x <- tibble::rownames_to_column(x, "rownames") %>% 
    melt('rownames') 

# assign concat columns as rownames 
row.names(x) <- str_c(x$rownames, x$variable) 

# Select relevant columns only 
x <- select(x, value) 

# Remove names from dataframe 
names(x) <- NULL 

> x 

ax 5 
bx 1 
ay 4 
by 2 
az 3 
bz 1 
1

dplyr-tidyr

library(dplyr) 
library(tidyr) 
df %>% 
    gather(var, val, -x) %>% 
    mutate(var=paste0(x, var)) %>% 
    select(var, val)%>% 
    arrange(var) 

# var val 
#1 ay 5 
#2 az 4 
#3 by 1 
#4 bz 2 
0

這是base R的另一種選擇

stack(setNames(as.list(unlist(df1[-1])), outer(df1$x, names(df1)[-1], paste0)))[2:1]