Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中将多行粘贴在一起_R_Matrix_Apply_Paste - Fatal编程技术网

在R中将多行粘贴在一起

在R中将多行粘贴在一起,r,matrix,apply,paste,R,Matrix,Apply,Paste,我有一个数据框,我想得到第1行与第2行粘贴的矩阵,第3行与第4行粘贴的矩阵,如果数据框有奇数行,保持最后一行不变,而不是粘贴行、粘贴列1和列2、列3和列4,矩阵将为: data <- data.frame(name = c(1:4), plate=c("A","B","C","D"), value1=c(4:7), value2 = c(100, 200, 300, 400)) data name plate value1 value2 1 A 4

我有一个数据框,我想得到第1行与第2行粘贴的矩阵,第3行与第4行粘贴的矩阵,如果数据框有奇数行,保持最后一行不变,而不是粘贴行、粘贴列1和列2、列3和列4,矩阵将为:

data <- data.frame(name = c(1:4), plate=c("A","B","C","D"), value1=c(4:7), value2 = c(100, 200, 300, 400))

data
     name plate value1 value2
      1     A      4    100
      2     B      5    200
      3     C      6    300
      4     D      7    400
矩阵按列粘贴的结果:

name-plate  value1-value2
  1-A          4-100
  2-B          5-200
  3-C          6-300
  4-D          7-400
我知道如何将它们粘贴在一起,但我不知道如何分别粘贴

> apply( data[,1:4] , 1, paste , collapse = "-" )
[1] "1-A-4-100" "2-B-5-200" "3-C-6-300" "4-D-7-400"

感谢您的帮助。

您可能可以从以下内容开始,提取奇数
(数据[c(T),F),])
和偶数
(数据[c(F,T),])
行,并使用
mapply
函数同时循环并粘贴它们。类似的逻辑也适用于列

mapply(paste, sep = "-", data[c(T,F),], data[c(F,T),])
#      -     <NA>  <NA>  <NA>     
# [1,] "1-2" "A-B" "4-5" "100-200"
# [2,] "3-4" "C-D" "6-7" "300-400"

mapply(paste, sep = "-", dat[,c(T,F)], dat[,c(F,T)])
#      -     <NA>   
# [1,] "1-A" "4-100"
# [2,] "2-B" "5-200"
# [3,] "3-C" "6-300"

注意:这不会处理奇数行或奇数列的情况,因此您将需要一些努力来处理它。

我们可以使用
lappy

as.data.frame(t(sapply(seq(1, nrow(data), by = 2), function(i)
                     apply(data[i:(i+1),], 2, paste, collapse="-"))))
 #    name plate value1  value2
 #1  1-2   A-B    4-5 100-200
 #2  3-4   C-D    6-7 300-400

setNames(as.data.frame(sapply(seq(1, nrow(data), by = 2), function(i) 
      apply(data[,i:(i+1)], 1, paste, collapse="-"))), c("name-plate", "value1-value2"))
#    name-plate value1-value2
#1        1-A         4-100
#2        2-B         5-200
#3        3-C         6-300
#4        4-D         7-400

另一种方法是使用tidyr包中的unite函数

library(tidyr)
data <- data.frame(name = c(1:4), 
                   plate=c("A","B","C","D"), 
                   value1=c(4:7), 
                   value2 = c(100, 200, 300, 400))
data %>% 
  unite("name-plate", name, plate, remove = T, sep = "-") %>% 
  unite("value1-value2", value1, value2, remove = T, sep = "-")

# outputs the following data.frame

     name-plate value1-value2
1        1-A         4-100
2        2-B         5-200
3        3-C         6-300
4        4-D         7-400
library(tidyr)
数据%
联合(“铭牌”,名称,铭牌,移除=T,sep=“-”)%>%
联合(“value1-value2”,value1,value2,remove=T,sep=“-”)
#输出以下数据帧
铭牌值1-2
11-A4-100
2-B 5-200
3-C 6-300
4-D 7-400
as.data.frame(t(sapply(seq(1, nrow(data), by = 2), function(i)
                     apply(data[i:(i+1),], 2, paste, collapse="-"))))
 #    name plate value1  value2
 #1  1-2   A-B    4-5 100-200
 #2  3-4   C-D    6-7 300-400

setNames(as.data.frame(sapply(seq(1, nrow(data), by = 2), function(i) 
      apply(data[,i:(i+1)], 1, paste, collapse="-"))), c("name-plate", "value1-value2"))
#    name-plate value1-value2
#1        1-A         4-100
#2        2-B         5-200
#3        3-C         6-300
#4        4-D         7-400
library(tidyr)
data <- data.frame(name = c(1:4), 
                   plate=c("A","B","C","D"), 
                   value1=c(4:7), 
                   value2 = c(100, 200, 300, 400))
data %>% 
  unite("name-plate", name, plate, remove = T, sep = "-") %>% 
  unite("value1-value2", value1, value2, remove = T, sep = "-")

# outputs the following data.frame

     name-plate value1-value2
1        1-A         4-100
2        2-B         5-200
3        3-C         6-300
4        4-D         7-400