我有一个数据框,其中每一行表示值随时间的变化:在数据框的每个单元格中,值可能会或可能不会在潜在的大量列上一列接一列地改变.

Goal个 最终目标是获得表示这些值随时间从一列变化到相邻一列(即COL1->COL2、COL2->COL3、COL3->COL4等)的值对的完整序列.

现在,我用for循环遍历数据帧列和select2个连续的col',rbind个这些值一起,如果需要的话,filter个结果(见下面的最小示例).

Question有没有比我的for循环更好的解决方案,或者甚至有专门迭代成ol‘的函数?

Current Approach

# Fake-dataframe ↓
test = data.frame(var1 = 2:5, 
  var2 = c(1, 3:5),
  var3 = c(1,3,4 , 8), 
  var4 = c(2:4, 8)
)

require(tidyverse)
cn <- colnames(test)
graph = data.frame(from = NA, to = NA, name = NA)
# Iterate into 'test' col and construct paired list of value ↓
for (i in 1:(ncol(test) - 1)) {
   graph  <- rbind(graph,    
                  select(test,
                             from = i, 
                              to = i + 1
                         ) %>%
                    mutate(name = cn[i+1])        
                ) 
}
graph <- na.omit(graph)
# Then I'll use some filter if I want to track change, e.g., filter(graph, from != to)

推荐答案

你可以试试Map

`row.names<-`(
   do.call(
      rbind,
      Map(
         \(x, y, z) data.frame(from = x, to = y, name = z),
         test[-length(test)],
         test[-1],
         names(test)[-1]
      )
   ), NULL
)

或者更直截了当(感谢@thelatmail的 Select )

data.frame(
   from = unlist(test[-length(test)], use.names = FALSE),
   to = unlist(test[-1], use.names = FALSE),
   name = rep(names(test[-1]), each = nrow(test))
)

这给了我们

   from to name
1     2  1 var2
2     3  3 var2
3     4  4 var2
4     5  5 var2
5     1  1 var3
6     3  3 var3
7     4  4 var3
8     5  8 var3
9     1  2 var4
10    3  3 var4
11    4  4 var4
12    8  8 var4

R相关问答推荐

如何对数据集进行逆向工程?

如何编辑ggplot的图例字使用自定义对象(gtable)?'

使用R闪光显示所有数据点作为默认设置

如何通过ggplot2添加短轴和删除长轴?

根据现有列的名称和字符串的存在进行变异以创建多个新列

从数据创建数字的命名列表.R中的框

使用geom_iles在一个切片中包含多个值

防止在更新SHINY中的Reactive Value的部分内容时触发依赖事件

R中治疗序列的相对时间指数

从线的交点创建面

防止正则表达式覆盖以前的语句

数据集上的R循环和存储模型系数

用满足特定列匹配的另一行替换NA行

整理ggmosaic图的标签

需要一个函数来在第一行创建一个新变量,然后用新变量替换一个不同的变量(对于多行)

如何获取R chromote中的当前URL?

如何在R中使用因子行求和?

在不带max()的data.table中按组查找最后一个元素

将R中对象的CSV数组转换为JSON数组

在一个multiplot中以非对称的方式在R中绘制多个图