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)
答案 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