我有一个数据帧,看起来是这样的:

example <- data.frame(
  date = as.Date(c('2001-01-01',
                   '2001-01-02',
                   '2001-01-01',
                   '2001-01-02')),
  PID_A = c(1091, 1091, 1037, 1037),
  PID_B = c(2091, 2091, 2037, 2037),
  resp_A = c(3,1,2,4),
  resp_B = c(2,4,3,1),
  connect_A = c(6,2,5,3),
  connect_B = c(5,3,6,2),
  test_A = c(3,9,0,0),
  test_B = c(1,1,1,1)
)

我想在相关列之间交换值,使X_A现在是X_B,X_B现在是X_A.我想在所有列中执行此操作,并将_A和_B附加到列名except PID_A和PID_A(例如,仅respconnecttest).实际上,我有更多这样的列,但出于示例的原因,我已将数据集简化为这三个变量.

有没有一种有效的方法来做到这一点?

这是所需的输出:

example_solution <- data.frame(
  date = as.Date(c('2001-01-01',
                   '2001-01-02',
                   '2001-01-01',
                   '2001-01-02')),
  PID_A = c(1091, 1091, 1037, 1037),
  PID_B = c(2091, 2091, 2037, 2037),
  resp_A = c(2,4,3,1),
  resp_B = c(3,1,2,4),
  connect_A = c(5,3,6,2),
  connect_B = c(6,2,5,3),
  test_A = c(1,1,1,1),
  test_B = c(3,9,0,0)
)

推荐答案

我认为最有效的方法是更改列名,而不是摆弄数据.

我们可以使用stringr::str_replace(),我们可以提供一个功能,而不是固定的替代.该函数将说明:如果列名以"_A"结尾,则使其以"_B"结尾,反之亦然(除非名称以"PID"开头).

col_order <- names(example) # In case you need to preserve order
names(example) <- stringr::str_replace(
    names(example),
    "(?<!^PID)_[AB]$",
    \(x) ifelse(x == "_A", "_B", "_A")
)

如果列顺序很重要,您可以切换回原始顺序.这不会创建数据的副本.

example  <- example[col_order]
#         date PID_A PID_B resp_A resp_B connect_A connect_B test_A test_B
# 1 2001-01-01  1091  2091      2      3         5         6      1      3
# 2 2001-01-02  1091  2091      4      1         3         2      1      9
# 3 2001-01-01  1037  2037      3      2         6         5      1      0
# 4 2001-01-02  1037  2037      1      4         2         3      1      0

Explanation of the regex pattern

我们可以使用negative lookbehind来匹配所有以"_A""_B"结尾的列名,除非字符串的开头紧跟"PID".

enter image description here

Regex visualiser

R相关问答推荐

如何判断某列中由某些行组成的百分比

如何在ggplot 2 geom_segment图表中将UTC转换为EET?

如何将具有重复名称的收件箱合并到R中的另一列中,而结果不同?

R形式的一维数字线/箱形图样式图表

根据shiny 应用程序中的数字输入更改图标 colored颜色

列出用m n个值替换来绘制n个数字的所有方法(i.o.w.:R中大小为n的集合的所有划分为m个不同子集)

使用R的序列覆盖

工作流程_set带有Dplyrr风格的 Select 器,用于 Select 结果和预测因子R

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

获取一个数据库框架的摘要,该数据库框架将包含一列数据库框架,

如何利用模型函数在格图中添加双曲/指数曲线

如何直接从R中的风险分数计算c指数?

根据日期从参考帧中创建不同的帧

我如何才能找到FAMILY=POISSON(LINK=&Q;LOG&Q;)中的模型预测指定值的日期?

给定开始日期和月份(数字),如何根据R中的开始日期和月数创建日期列

Ggplot2中geom_tile的动态zoom

当我添加美学时,geom_point未对齐

如何筛选截止年份之前最后一个测量年度的所有观测值以及截止年份之后所有年份的所有观测值

网络抓取新闻标题和时间

从两个数据帧中,有没有办法计算R中一列的唯一值?