【问题标题】:Fill an empty dataframe by rows with paired ratios of rows of another dataframe用另一个数据帧的行的成对比率填充一个空数据帧
【发布时间】: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 循环有问题。但我不明白问题出在哪里。

用于计算的datafrfame(head(df)的结果):

【问题讨论】:

  • 在我的脑海中,我认为你需要有 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 行并且您是试图根据kratio_df 中替换一行
  • 也许我弄错了。但是如果rows24 这将导致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


【解决方案1】:

假设要求是计算对 row1/row2、row3/row4 等的比率......

试试这个:

as.data.frame(t(sapply(seq(1,(nrow(df)-1),2),function(x,df){df[x,]/df[x+1,]},df)))

df 是你的data.frame

【讨论】:

  • 谢谢。这就是我需要的。但我仍然想了解如何为这种情况正确编写 for 循环。用于我未来的编码。
  • @Elena i 和 j 不是索引,它们是索引的向量。您需要将 dataframe[i,]/dataframe[j,] 替换为 dataframe[i[k],]/dataframe[j[k],]... 因为 i 和 j 是长度为 3 的向量,对于每个值k 将生成 3 个比率值
  • @Elena burton0320 的解释是正确的。按照我在 for 循环中的评论中的建议进行更改。
  • 感谢您的帮助和解释。我按照您的建议更改了 for 循环:paired_row_rat=function(dataframe,rows,columns){ ratio_df=data.frame(matrix(nrow=rows/2,ncol=columns)) cln=colnames(dataframe) colnames(ratio_df)=cln i=seq(1,rows,by=2) j=i+1 for(k in 1:nrow(ratio_df)){ ratio_df[k,]=dataframe[i[k],]/dataframe[j[k],] } } 当我在我的数据帧上运行它时,我收到一条错误消息:数据帧 [i[k],] 中的错误:维数不正确。但是,当我在函数之外执行所有步骤时,一切都运行良好。我会非常感谢任何帮助。
  • 您刚刚在评论中编写的代码没有 return(ratio_df)...还要确保您传递的行和列的正确值,理想情况下行应该是偶数。跨度>
猜你喜欢
  • 2021-12-25
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
相关资源
最近更新 更多