3

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.0001)

4

2 回答 2

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等于列数,这样你就不会因为回收而得到任何令人惊讶的结果。

于 2013-03-21T07:33:00.470 回答
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
于 2013-03-21T07:26:57.580 回答