r - 在 R 中将多行粘贴在一起

标签 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    100
      2     B      5    200
      3     C      6    300
      4     D      7    400

矩阵按行粘贴的结果:

 name   plate  value1   value2
 1-2    A-B    4-5      100-200
 3-4    C-D    6-7      300-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"

感谢您的帮助。

最佳答案

您可能可以从以下内容开始,在其中提取奇数 (data[c(T, F), ]) 和偶数 (data[c(F, T ), ]) 分别行,并使用 maply 函数同时循环遍历它们并将它们粘贴在一起。类似的逻辑也适用于列。

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"

如果需要同时设置列名:

setNames(as.data.frame(mapply(paste, sep = "-", data[c(T,F),], data[c(F,T),])), 
         names(data))
#   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(mapply(paste, sep = "-", data[,c(T,F)], data[,c(F,T)])), 
         paste(names(data)[c(T,F)], names(data)[c(F,T)], sep = "-"))
#   name-plate value1-value2
# 1        1-A         4-100
# 2        2-B         5-200
# 3        3-C         6-300
# 4        4-D         7-400

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

关于r - 在 R 中将多行粘贴在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37901142/

相关文章:

将输入转换为类时出现 C++ Boost 矩阵错误

r - 对数据进行分组并生成新列

r - ggplot2 中随时间变化的 CumSum 与 Total 的关系

arrays - 矩阵数组部分的最大和

r - 按行填充矩阵或转置按列填充的矩阵更快吗?

Python:逐行替换数据帧值

r - 如何通过替换 "for-loop"和 "if-else"子句来提高大型数据集的性能

r - 如何根据列名创建列的值?

如果 r 中的值变为负数,则重置 cumsum