【发布时间】:2017-05-16 12:31:40
【问题描述】:
我有一个数据框,对于所有列,我想计算成对的行比率(例如,row1/row2、row3/row4、row5/row6 等)并将计算结果写入一个新的数据框.我决定将它包装在一个带有 3 个参数的函数中:
paired_row_rat=function(dataframe,rows,columns){
ratio_df=data.frame(matrix(nrow=rows/2,ncol=columns)) #creates new dataframe
#where number of columns is the same as in dataframe used for
#calculation, number of rows for paired ratios will be 2 times lower
cln=colnames(dataframe) #names of columns should be equal in both
colnames(ratio_df)=cln #dataframes
i=seq(1,rows,by=2) #sequance for choosing the first row of calculation
j=i+1 #for choosing second row of calculation
for (k in 1:nrow(ratio_df)){ #here as I am trying to fill new
ratio_df[k,]=dataframe[i,]/dataframe[j,] #dataframe with ratios,
} #the error appears
return(ratio_df)
}
pmap(list(tula3,24,98),paired_row_rat)
#runs the function for my dataframe with 24 rows and 98 columns
在结果数据框中,每一列的所有行都有相同的值,我收到了来自 R 的警告:
警告() 警告信息: 1: 在
[<-.data.frame(*tmp*, k, , value = structure(list( ... : 替换元素1有12行替换1行
我已经搜索了很多可能的解决方案,但仍然无法解决此问题。 for 循环有问题。但我不明白问题出在哪里。
【问题讨论】:
-
在我的脑海中,我认为你需要有 2 个循环,每行一个,每列一个。假设我有一个 2*2 矩阵。我需要一个
i和一个j来计算矩阵中每个元素的值。 -
seq(1,rows,by=2)rows是如何定义的?i是一个序列而不是单个数字。对!?i不会只索引一行。 -
number of rows 是函数的参数,所以它是在数据帧上使用函数时定义的。 i 是一个序列。
-
是的,但是如果
row是假设7那么结果将是seq(1,7,by=2)==>1 3 5 7这将在您的dataframe中选择4行并且您是试图根据k在ratio_df中替换一行 -
也许我弄错了。但是如果
rows是24这将导致ratio_df[k,]=dataframe[1 3 5 7 9 11 13 15 17 19 21 23,]/dataframe[2 4 6 8 10 12 14 16 18 20 22 24,]这会给你12数字,你尝试将这些12数字填充到ratio_df的一行中。
标签: r function loops dataframe