Regex R dataframe:具有for循环和正则表达式的新变量
在R中,我希望通过在特定的现有变量之间进行一些计算,在数据框架中创建新的变量。新变量的变量名以及计算中使用的特定现有变量由正则表达式定义(或应该由正则表达式定义) 我知道描述有点混乱,所以这里有一个虚构数据集的示例,其中一些变量(V1、V2、V3)在两个不同的时间点(T1、T2)测量: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_
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))) ]