混合数据帧与向量的乘法

时间:2013-03-21 07:10:09

标签: r vector dataframe

R初学者:在搜索了一天之内必须简单的答案之后,决定在这里发布我的第一个问题:

我想将数据框中的数字列与数字向量相乘(或除)。数据框不仅包含数字,还包含字符串。在我的搜索中,我了解了t(t(mydf) * myvec))sweep()scale()*apply()和替换操作,但我无法找出一个聪明的函数来允许我指定哪些列相乘而不对数据帧进行子集化。

如何将test.dat的最后两列中的每一行乘以/除以myvec并获取包含结果的数据帧以及未更改的列> (对于数字,我可以在myvec中添加'1')。但是我该如何处理这些名字呢? 提前谢谢!!

正确的例子:

  

mydf< -as.data.frame(rbind(c(“chrX”,5624624,5631869,“Nudt11”,2,“+”,1,7245,1.332,9651.3),c(“chrX”, 5977262,6210835,“Shroom4”,9,“+”,1,233573,1.357,316914)))

     

colnames(mydf)< -c(“chr”,“start”,“end”,“name”,“score”,“strand”,“score2”,“width”,“value”,“value2 “)

     

myvec< -c(10,0。0.0001)

2 个答案:

答案 0 :(得分:4)

如前所述,您没有处理示例中的data.frame。我们首先将您的数据设为data.frame

# bind the numerical values as variables (columns) of data.frame
mydf <-as.data.frame(cbind(
 c(1, 10, 3.6, 4.5, 5.4, 99), 
 c(12, 18, 9, 8.1, 7.2, 84)))

# give names to columns: 
names(mydf)<-c("somename","othername")

#multiply the wanted rows with myvec:

mydf[4:6,]<-myvec*mydf[4:6,]
mydf
  somename othername
1  1.00000  12.00000
2 10.00000  18.00000
3  3.60000   9.00000
4 40.50000  72.90000
5 54.00000  72.00000
6 16.50033  14.00028

编辑:同样,您的示例数据不是data.frame,但是在将其调整到数据值确实是数字而非因素的正确数据框之后,这仍然有效:

mydf[,9:10]<-myvec*mydf[,9:10]
mydf
   chr   start     end    name score strand score2  width     value     value2
1 chrX 5624624 5631869  Nudt11     2      +      1   7245 1.332e+01 96513.0000
2 chrX 5977262 6210835 Shroom4     9      +      1 233573 1.357e-04    31.6914

因此,您可以使用方括号选择所需的列,只需确保myvec的长度等于列数,这样您就不会因为回收而产生任何惊人的结果。

答案 1 :(得分:1)

第一步是将您的字符矩阵mydf(它不是数据框)更改为具有命名列的数据框:

mydf2 <- setNames(as.data.frame("mode<-"(t(mydf[ , -1]), "numeric")), mydf[ , 1])

> mydf2
  somename othername
1      1.0      12.0
2     10.0      18.0
3      3.6       9.0
4      4.5       8.1
5      5.4       7.2
6     99.0      84.0

然后使用myvec

进行乘法很容易
res <- lapply(mydf2[4:6, ], "*", myvec)

将值替换为新值:

mydf2[4:6, ] <- res

> mydf2
  somename othername
1  1.00000  12.00000
2 10.00000  18.00000
3  3.60000   9.00000
4 40.50000  72.90000
5 54.00000  72.00000
6 16.50033  14.00028

<强>更新

根据您的编辑,这是一种方法:

last2 <- tail(seq_along(mydf), 2) # find the index of the last two columns

# transform columns from factor to numeric and multiplicate with vector
res <- lapply(lapply(mydf[last2], 
                     function(x) as.numeric(as.character(x))), "*", myvec)

mydf[last2] <- res # replace values

> mydf
   chr   start     end    name score strand score2  width     value     value2
1 chrX 5624624 5631869  Nudt11     2      +      1   7245 1.332e+01 96513.0000
2 chrX 5977262 6210835 Shroom4     9      +      1 233573 1.357e-04    31.6914
相关问题