首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据帧的不同子集乘以不同的向量

将数据帧的不同子集乘以不同的向量
EN

Stack Overflow用户
提问于 2011-07-30 04:50:06
回答 4查看 5.7K关注 0票数 4

我想把数据框中的几列乘以一个值的向量。值的特定向量根据另一列中的值而变化。

-编辑--

如果我使数据集变得更加复杂,例如,超过2个条件,并且这些条件在数据集周围随机打乱,该怎么办?

以下是我的数据集的一个示例:

代码语言:javascript
复制
df=data.frame(
  Treatment=(rep(LETTERS[1:4],each=2)),
  Species=rep(1:4,each=2),
  Value1=c(0,0,1,3,4,2,0,0),
  Value2=c(0,0,3,4,2,1,4,5),
  Value3=c(0,2,4,5,2,1,4,5),
  Condition=c("A","B","A","C","B","A","B","C")
  )

看起来是这样的:

代码语言:javascript
复制
 Treatment Species Value1 Value2 Value3 Condition
     A       1      0      0      0         A
     A       1      0      0      2         B 
     B       2      1      3      4         A
     B       2      3      4      5         C
     C       3      4      2      2         B
     C       3      2      1      1         A
     D       4      0      4      4         B
     D       4      0      5      5         C

如果为Condition=="A",我想将第3-5列乘以向量c(1,2,3)。如果为Condition=="B",我想将第3-5列乘以向量c(4,5,6)。如果为Condition=="C",我想将第3-5列乘以向量c(0,1,0)。因此,生成的数据帧将如下所示:

代码语言:javascript
复制
 Treatment Species Value1 Value2 Value3 Condition
     A       1      0      0      0         A
     A       1      0      0     12         B 
     B       2      1      6     12         A
     B       2      0      4      0         C
     C       3     16     10     12         B
     C       3      2      2      3         A
     D       4      0     20     24         B
     D       4      0      5      0         C

我试着对数据帧进行子化,然后乘以向量:

代码语言:javascript
复制
t(t(subset(df[,3:5],df[,6]=="A")) * c(1,2,3))

但我不能将子集的数据帧返回到原始数据帧。有没有办法在不对数据帧设置子集的情况下执行此操作,以便保留其他列(例如,处理、物种)?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-30 07:07:33

这里有一个相当通用的解决方案,您应该能够适应您的需求。

注意,outer调用中的第一个参数是逻辑向量,第二个参数是数值,因此在乘法之前,TRUEFALSE将分别转换为10。我们可以添加outer结果,因为条件是不重叠的,并且FALSE元素将为零。

代码语言:javascript
复制
multiples <-
  outer(df$Condition=="A",c(1,2,3)) +
  outer(df$Condition=="B",c(4,5,6)) +
  outer(df$Condition=="C",c(0,1,0))

df[,3:5] <- df[,3:5] * multiples
票数 9
EN

Stack Overflow用户

发布于 2011-07-30 05:07:46

编辑以反映评论中的一些注释

假设Condition是一个因素,您可以这样做:

代码语言:javascript
复制
#Modified to reflect OP's edit - the same solution works just fine
m <- matrix(c(1:6,0,1,0),3,3,byrow = TRUE)
df[,3:5] <- with(df,df[,3:5] * m[Condition,])

这利用了相当快的矢量化乘法。显然,将它包装在with中并不是绝对必要的,它只是从我的大脑中突然冒出来的东西。还要注意Backlin下面的子集注释。

更全面地说,记住你可以用subset做的每个子集,你也可以用[做,更重要的是,[支持通过[<-进行赋值。因此,如果你想改变数据框或矩阵的一部分,你总是可以使用这种类型的习惯用法:

代码语言:javascript
复制
df[rowCondition,colCondition] <- <replacement values>

当然,假设<replacement values>与您的df子集具有相同的维度。它可能会以其他方式工作,但你会与R的回收规则发生冲突,R可能会反击警告。

票数 2
EN

Stack Overflow用户

发布于 2011-07-30 06:41:52

这是一个非矢量化的,但易于理解的解决方案:

代码语言:javascript
复制
 replaceFunction <- function(v){
   m <- as.numeric(v[3:5])
   if (v[6]=="A")
     out <- m * c(1,2,3)
   else if (v[6]=="B")
     out <- m * c(4,5,6)
   else
     out <- m
   return(out)
 }

 g <- apply(df, 1, replaceFunction)
 df[3:5] <- t(g)
 df
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6878899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档