R 基于特定转换标准的数据转换

R 基于特定转换标准的数据转换,r,R,我想基于某些条件转换数据集。这些条件在另一个数据集中给出。让我用一个例子来解释一下 假设我有一个以下格式的数据集: Date Var1 Var2 3/1/2016 8 14 3/2/2016 7 8 3/3/2016 7 6 3/4/2016 10 8 3/5/2016 5 10 3/6/2016 9 15 3/7/2016 2 5 3/8/2016 6 14 3/9/2016 8 15 3/10

我想基于某些条件转换数据集。这些条件在另一个数据集中给出。让我用一个例子来解释一下

假设我有一个以下格式的数据集:

Date       Var1 Var2
3/1/2016    8   14
3/2/2016    7   8
3/3/2016    7   6
3/4/2016    10  8
3/5/2016    5   10
3/6/2016    9   15
3/7/2016    2   5
3/8/2016    6   14
3/9/2016    8   15
3/10/2016   8   8
Variable    Trans1  Trans2
  Var1       1||2   0.5||0.7
  Var2       1||2   0.3||0.8
以下数据集具有转换条件,格式如下:

Date       Var1 Var2
3/1/2016    8   14
3/2/2016    7   8
3/3/2016    7   6
3/4/2016    10  8
3/5/2016    5   10
3/6/2016    9   15
3/7/2016    2   5
3/8/2016    6   14
3/9/2016    8   15
3/10/2016   8   8
Variable    Trans1  Trans2
  Var1       1||2   0.5||0.7
  Var2       1||2   0.3||0.8
现在,我想从Var1的转换表中提取第一个条件,1.0.5,并将1添加到Var1,然后将其乘以0.5。我将对var2做同样的处理,加1,再乘以0.3。这个转换将给我新的变量Var1_1和var2_1。我将对另一个转换执行相同的操作,它将为我提供Var1_2和Var2_2。对于Var1_2,转换为Var1与2之和乘以0.7

转换后,数据集将如下所示:

  Date     Var1 Var2    Var1_1  Var2_1  Var1_2  Var2_2
3/1/2016    8   14       4.5     4.5      7      11.2
3/2/2016    7   8        4       2.7      6.3     7
3/3/2016    7   6        4       2.1      6.3     5.6
3/4/2016    10  8        5.5     2.7      8.4     7
3/5/2016    5   10       3       3.3      4.9     8.4
3/6/2016    9   15       5       4.8      7.7    11.9
3/7/2016    2   5        1.5     1.8      2.8     4.9
3/8/2016    6   14       3.5     4.5      5.6    11.2
3/9/2016    8   15       4.5     4.8      7      11.9
3/10/2016   8   8        4.5     2.7      7       7

假设您的原始data.frame被称为
df
,并且您的条件表
cond1
,那么我们可以创建一个自定义函数

funV1Cond1 <- function(x){
  t1 <- as.numeric(gsub("[||].*", "", cond1$Trans1[cond1$Variable == "Var1"]))
  t2 <- as.numeric(gsub("[||].*", "", cond1$Trans2[cond1$Variable == "Var1"]))
  result <- (x$Var1 + t1)*t2
  return(result)
}
funV1Cond1(df)
 #[1] 4.5 4.0 4.0 5.5 3.0 5.0 1.5 3.5 4.5 4.5

请注意,我将delimeter更改为“,”

鉴于您的原始data.frame被称为
df
,并且您的条件表
cond1
,那么我们可以创建一个自定义函数

funV1Cond1 <- function(x){
  t1 <- as.numeric(gsub("[||].*", "", cond1$Trans1[cond1$Variable == "Var1"]))
  t2 <- as.numeric(gsub("[||].*", "", cond1$Trans2[cond1$Variable == "Var1"]))
  result <- (x$Var1 + t1)*t2
  return(result)
}
funV1Cond1(df)
 #[1] 4.5 4.0 4.0 5.5 3.0 5.0 1.5 3.5 4.5 4.5


请注意,我将delimeter更改为“,”

您确实应该至少共享“条件”数据集的
dput
。@Sotos:谢谢您的评论。但是我不明白你说的条件是什么意思。@beetroot:谢谢你的评论。我在计算中出错了。我纠正了它。谢谢列
Trans1
Trans2
是否与示例中所示的方式相同?i、 e.“数与数之间的分隔符?”索托斯:它们是两个数之间的分隔符。我可以用“,”而不是“| |”。这样说只是为了让它更突出。你真的应该至少分享你的“条件”数据集的
dput
。@Sotos:谢谢你的评论。但是我不明白你说的条件是什么意思。@beetroot:谢谢你的评论。我在计算中出错了。我纠正了它。谢谢列
Trans1
Trans2
是否与示例中所示的方式相同?i、 e.“数与数之间的分隔符?”索托斯:它们是两个数之间的分隔符。我可以用“,”而不是“| |”。这样说只是为了让它更突出。非常感谢你的回答。我也可以很快地概括它。但我唯一的问题是关于“gsub”。假设我有多个条件,每个条件用一个分隔符分隔(就像我的例子中用“| |”)一样,我仍然可以使用您的示例。一旦我能查出来,我会记下你的答案。不过非常感谢!否。多个转换条件使用相同的分隔符。您使用“.*[| |]]”提取第二个条件。现在,假设我有3个条件。通过使用这个,我将如何得到第二个条件?嗯…那么可能最好将整个列拆分为3个单独的列…我可以稍后再看一下。。。现在就要开会了谢谢索托斯:)你帮了大忙!非常感谢你的回答。我也可以很快地概括它。但我唯一的问题是关于“gsub”。假设我有多个条件,每个条件用一个分隔符分隔(就像我的例子中用“| |”)一样,我仍然可以使用您的示例。一旦我能查出来,我会记下你的答案。不过非常感谢!否。多个转换条件使用相同的分隔符。您使用“.*[| |]]”提取第二个条件。现在,假设我有3个条件。通过使用这个,我将如何得到第二个条件?嗯…那么可能最好将整个列拆分为3个单独的列…我可以稍后再看一下。。。现在就要开会了谢谢索托斯:)你帮了大忙!