【问题标题】:Dividing remaining Data Frame by Vector将剩余的数据帧除以向量
【发布时间】:2019-02-25 16:55:34
【问题描述】:

我有一个 68 x 252 的数据框。我试图找出每个向量相对于第一个向量的对数变化。即如果 v1 = 68 和 v2,v3,v4 = 70, 71, 72... 我希望新的数据帧输出为 0, 0.013,0.019,0.025。

data<-data[3:nrow(data)]/data[2:2]

返回

"Ops.data.frame 中的错误(data[3:nrow(data)], data[2:2]) : '/' only 为相同大小的数据帧定义”

我也尝试过制作自己的矩阵

div<-as.vector(data[2:2])
num<-as.matrix(data[3:nrow(data)])
test<-num/div

返回:

num/div 中的错误:不一致的数组

log(num/div)

【问题讨论】:

  • 试试data[3:nrow(data),] &lt;- data[3:nrow(data),]/data[2,2]
  • 谢谢!这些似乎是简单的返回,有没有办法代替日志?
  • 我也收到了“警告信息:在 Ops.factor(left, right) 中:‘/’对因子没有意义”
  • 也就是说,你有 factor 类而不是 numeric
  • 我是否必须将整个 data.frame 转换为矩阵以使所有向量都是数字的?

标签: r logging matrix vector


【解决方案1】:

我认为 data.frames 比矩阵更容易使用。我喜欢将问题的每一步都保留为不同的 data.frame,以便在需要时轻松追溯步骤,并且我可以清楚地看到每个转换都做了什么。

如果我们从一些示例数据开始(尽管通常您会使用 read.csv 或类似的东西从文件中读取这些数据):

#get data as a data frame
df <- structure(list(v1 = c(68, 120), v2 = c(70, 121), v3 = c(71, 122), v4 = c(72, 123)), class = "data.frame", row.names = c("row1", "row2"))

df
      v1  v2  v3  v4
row1  68  70  71  72
row2 120 121 122 123

转换为对数(base10):

#take log (base 10) of data frame
df_log <- log10(df)

df_log
           v1       v2       v3       v4
row1 1.832509 1.845098 1.851258 1.857332
row2 2.079181 2.082785 2.086360 2.089905

最后一步...

df_ans <- df_log[,] - df_log[,1] 

这意味着,从我们的日志数据框df_log[,] 的每一行和每一列中减去第一列df_log[,1] 的值并将结果存储在df_ans 中。

结果:

df_ans
     v1          v2          v3         v4
row1  0 0.012589127 0.018749436 0.02482358
row2  0 0.003604124 0.007178585 0.01072387

注意:最后一个操作必须使用两个不同的数据帧df_ansdf_log 完成。如果您尝试在像df_log &lt;- df_log[,] - df_log[,1] 这样的同一个data.frame 上执行所有操作,它将无法工作,因为df_log[,1] 将在操作中修改为0,然后您将从所有单元格中减去0不会很好用!

【讨论】:

  • 没问题。 :)。乐意效劳。尝试点击勾选标记将问题标记为已回答。
  • 如果我们稍微改变一下逻辑呢?如果我们决定要逐行减去每一行 1。我调整了数据帧的格式,以前在 V1 中的内容现在在第 1 行。log_data&lt;-log10(data)log_ret&lt;-log_data-log_data[1,]“Ops.data.frame 中的错误(log_data , log_data[1, ]) : '-' 只为同样大小的数据框定义" 谢谢
  • 如果行和列的语法是对称的就好了,但是唉。 This question 地址,但您的选择是:1)创建一个重复第 1 行的数据帧,其大小与原始数据帧相同,并从另一个数据帧中减去一个数据帧,或 2)使用 for-循环遍历行。对于行操作,我通常使用选项 2。
猜你喜欢
  • 2022-01-07
  • 2012-11-29
  • 2020-11-20
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
相关资源
最近更新 更多