如何从R中列中的每个值中减去数据框中特定位置的数字

how to subtract a number in a specific position in dataframe from every value in a column in R

我有一个包含 216 行和 12 列的数据框,我正在尝试添加一个新列,其中每个值等于第 12 列中每个元素与第 216 行中元素值之间的差值,第 12 列 (df[216,12])。当我尝试使用简化版本的数据框(即只有 5 列而不是 216 列)执行此操作时,它没有问题,但现在我正在尝试对完整数据集做同样的事情,它给我一个错误提示 "Error in Ops.data.frame(df_final[, 12], df_final[216, 12]) :‘-’ only defined for equally-sized data frames"。不确定为什么会收到该错误或如何修复它..

出于说明目的,我的数据集的简化版本如下(代码适用于这个简化的数据集,但不适用于我的完整数据集,有 216 行,而不是只有 5 行):

miRNA<-c("hsa-miR-10a-4373153", "hsa-miR-10b-4395329", "MammU6-4395470_1", "MammU6-4395470_2", "hsa-miR-15a-4373123")
C1<-c(28.005966, 30.806433, 17.341375, 17.40666, 30.039436)
T2<-c(30.973469, 29.236025, 30.41161, 20.914383, 20.904331)
C3<-c(26.322796, 25.542833, 22.460772, 19.972183, 30.409641)
T4<-c(26.441898, 25.837685, 23.158352, 20.379173, 33.81327)
C5<-c(39.750206, 19.901133, 28.180124, 22.668673, 25.748884)
T6<-c(23.004385, 28.472675, 23.81621, 26.433413, 28.851719)
T7<-c(22.239546, 28.741674, 23.754929, 26.015385, 28.16368)
T8<-c(29.590443, 30.041988, 21.323061, 24.272501, 18.099016)
C9<-c(15.856442, 22.64224, 29.629637, 25.374926, 22.356894)
C10<-c(38.137985, 24.753338, 26.986668, 24.578161, 19.223558)
data<-data.frame(miRNA, C1, T2, C3, T4, C5, T6, T7, T8, C9, C10)
View(data)
data$C12<-data[,11]-data[5,11]

问题是它是 tbl_df。与 data.frame 不同,data[,11] 不会折叠成 vector。它仍然是具有单列的 tbl_df。有很多选择

unlist(data[,11])- unlist(data[5,11])

使用可重现的例子

df1 <- tibble(col1 = 1:5, col2 = 6:10)
df1[, 2] - df1[1, 2]

Error in Ops.data.frame(df1[, 2], df1[1, 2]) : ‘-’ only defined for equally-sized data frames

unlist(df1[,2]) - unlist(df1[1,2])

或使用 drop = TRUE,在 tibblewhereas indata.frame, it isTRUE`

中默认为 FALSE
df1[[2]] - df1[1,2, drop = TRUE]

注意这里我们使用[[将列提取为vector

或者另一种选择是使用 dplyr 函数

library(dplyr)
df1 %>%
    mutate_at(2, ~ . - .[2])