Regex R dataframe:具有for循环和正则表达式的新变量

Regex R dataframe:具有for循环和正则表达式的新变量,regex,r,for-loop,dataframe,Regex,R,For Loop,Dataframe,在R中,我希望通过在特定的现有变量之间进行一些计算,在数据框架中创建新的变量。新变量的变量名以及计算中使用的特定现有变量由正则表达式定义(或应该由正则表达式定义) 我知道描述有点混乱,所以这里有一个虚构数据集的示例,其中一些变量(V1、V2、V3)在两个不同的时间点(T1、T2)测量: dataframe由于您的示例没有完全反映您的问题,我冒昧创建了一个新的数据集,我认为它尊重了您问题的精神: 让我们假设df Subject V1_T1 V1_T2 V2_

在R中,我希望通过在特定的现有变量之间进行一些计算,在数据框架中创建新的变量。新变量的变量名以及计算中使用的特定现有变量由正则表达式定义(或应该由正则表达式定义)

我知道描述有点混乱,所以这里有一个虚构数据集的示例,其中一些变量(V1、V2、V3)在两个不同的时间点(T1、T2)测量:


dataframe由于您的示例没有完全反映您的问题,我冒昧创建了一个新的数据集,我认为它尊重了您问题的精神:

让我们假设
df

   Subject       V1_T1       V1_T2      V2_T1       V2_T2       V3_T1       V3_T2
1        A  0.16694311  0.47190422  0.6571530  1.68428290  0.60685147  1.25383252
2        B  0.45561405  1.01849804  1.6041593 -1.40256942  1.50029772  1.34857932
3        C  0.31762739 -0.78986513 -0.8054005 -0.14714956 -0.63612792 -0.13565903
4        D  0.66536682 -0.57231682  0.1362731  0.03632215 -0.82147539  0.42349920
5        E  0.09113996  0.73319950  0.1046914 -0.75730274 -0.72833574  0.08412158
6        F  0.01751232 -0.78021331 -0.9158299 -0.68345547 -0.08848462 -0.18618554
7        G -0.96602939  1.08286247  0.6116285  0.08982368  0.12721634  0.71738577
8        H -1.06444232 -0.03971332 -0.5394623 -1.34349634 -0.76919950 -3.01150549
9        I -0.83680136 -0.54609901 -0.1261597 -1.13312110  0.23785615  0.85203224
10       J  1.98656695 -0.01522142  0.7850551  0.93551804 -0.26279470 -0.80375911
对于每个
主题
,创建两个新列
V4_T1
V4_T2
,作为其各自
Tn
值的结果
(V1+V2)/V3


您可以使用
gather()
以长格式重新构造数据,然后
separate()
在两个不同的列中分离初始列名,
spread()
以宽格式返回结果,以便对每个
主题执行操作
Tn
组合并使用
mutate()存储在
V4
。然后,我们最后一次将
collect()
聚集到
unite()
列中,并将结果展开,以获得所需的输出:

library(tidyr)
library(dplyr)

df %>%
  gather(key, value, -Subject) %>%
  separate(key, c("V", "T")) %>%
  spread(V, value) %>%
  mutate(V4 = (V1 + V2) / V3) %>%
  gather(key, value, -(Subject:T)) %>%
  unite(R, key, T) %>%
  spread(R, value)
其中:

   Subject       V1_T1       V1_T2      V2_T1       V2_T2       V3_T1       V3_T2
1        A  0.16694311  0.47190422  0.6571530  1.68428290  0.60685147  1.25383252
2        B  0.45561405  1.01849804  1.6041593 -1.40256942  1.50029772  1.34857932
3        C  0.31762739 -0.78986513 -0.8054005 -0.14714956 -0.63612792 -0.13565903
4        D  0.66536682 -0.57231682  0.1362731  0.03632215 -0.82147539  0.42349920
5        E  0.09113996  0.73319950  0.1046914 -0.75730274 -0.72833574  0.08412158
6        F  0.01751232 -0.78021331 -0.9158299 -0.68345547 -0.08848462 -0.18618554
7        G -0.96602939  1.08286247  0.6116285  0.08982368  0.12721634  0.71738577
8        H -1.06444232 -0.03971332 -0.5394623 -1.34349634 -0.76919950 -3.01150549
9        I -0.83680136 -0.54609901 -0.1261597 -1.13312110  0.23785615  0.85203224
10       J  1.98656695 -0.01522142  0.7850551  0.93551804 -0.26279470 -0.80375911
         V4_T1      V4_T2
1    1.3579865  1.7196771
2    1.3729097 -0.2847970
3    0.7667846  6.9071309
4   -0.9758538 -1.2656332
5   -0.2688751 -0.2865285
6   10.1522452  7.8613452
7   -2.7858123  1.6346660
8    2.0851608  0.4593084
9   -4.0485020 -1.9708410
10 -10.5467198 -1.1449906

尝试
数据表
解决方案:

library(data.table)
setDT(dataframe)


# define name of new columns to create
  cols <- noquote(paste0("V4_T",1:4))


dataframe[ , (cols) := lapply(list(1:4), function(x)  get(paste0("V1_T", x)) + get(paste0("V2_T", x)) / get(paste0("V3_T", x)))  ]
库(data.table)
setDT(数据帧)
#定义要创建的新列的名称

cols非常感谢您的全面回复!好的,谢谢你的回复!它很整洁,很有技巧。我只接受前面的回答,因为这是第一个回答,但这个解决方案同样有效。
   Subject       V1_T1       V1_T2      V2_T1       V2_T2       V3_T1       V3_T2
1        A  0.16694311  0.47190422  0.6571530  1.68428290  0.60685147  1.25383252
2        B  0.45561405  1.01849804  1.6041593 -1.40256942  1.50029772  1.34857932
3        C  0.31762739 -0.78986513 -0.8054005 -0.14714956 -0.63612792 -0.13565903
4        D  0.66536682 -0.57231682  0.1362731  0.03632215 -0.82147539  0.42349920
5        E  0.09113996  0.73319950  0.1046914 -0.75730274 -0.72833574  0.08412158
6        F  0.01751232 -0.78021331 -0.9158299 -0.68345547 -0.08848462 -0.18618554
7        G -0.96602939  1.08286247  0.6116285  0.08982368  0.12721634  0.71738577
8        H -1.06444232 -0.03971332 -0.5394623 -1.34349634 -0.76919950 -3.01150549
9        I -0.83680136 -0.54609901 -0.1261597 -1.13312110  0.23785615  0.85203224
10       J  1.98656695 -0.01522142  0.7850551  0.93551804 -0.26279470 -0.80375911
         V4_T1      V4_T2
1    1.3579865  1.7196771
2    1.3729097 -0.2847970
3    0.7667846  6.9071309
4   -0.9758538 -1.2656332
5   -0.2688751 -0.2865285
6   10.1522452  7.8613452
7   -2.7858123  1.6346660
8    2.0851608  0.4593084
9   -4.0485020 -1.9708410
10 -10.5467198 -1.1449906
library(data.table)
setDT(dataframe)


# define name of new columns to create
  cols <- noquote(paste0("V4_T",1:4))


dataframe[ , (cols) := lapply(list(1:4), function(x)  get(paste0("V1_T", x)) + get(paste0("V2_T", x)) / get(paste0("V3_T", x)))  ]