R 按名称减去数据帧的列

R 按名称减去数据帧的列,r,dataframe,subtraction,R,Dataframe,Subtraction,假设我有一个数据帧,如下所示: df <- as.data.frame(matrix(seq(1,20,1),nrow=4), byrow=TRUE) colnames(df) <- c("X1","X2","X3","X4","X5") rownames(df) <- as.Date(c("2020-01-02","2020-01-03"

假设我有一个数据帧,如下所示:

df <- as.data.frame(matrix(seq(1,20,1),nrow=4), byrow=TRUE)
colnames(df) <- c("X1","X2","X3","X4","X5")
rownames(df) <- as.Date(c("2020-01-02","2020-01-03","2020-01-04","2020-01-05"))

df
           X1 X2 X3 X4 X5
2020-01-02  1  2  3  4  5
2020-01-03  6  7  8  9 10
2020-01-04 11 12 13 14 15
2020-01-05 16 17 18 19 20
但它只适用于第一列。如何为所有列运行它?

尝试这个不带循环的基本R解决方案。只需记住立柱的位置:

#Data
df <- as.data.frame(matrix(seq(1,20,1),nrow=4), byrow=TRUE)
colnames(df) <- c("X1","X2","X3","X4","X5")
rownames(df) <- as.Date(c("2020-01-02","2020-01-03","2020-01-04","2020-01-05"))
#Set columns for difference
df[,2:5] <- df[,2:5]-df[,1]
或者更复杂的方法是:

#Create index
#Var to substract
i1 <- which(names(df)=='X1')
#Vars to be substracted with X1
i2 <- which(names(df)!='X1')
#Compute
df[,i2]<-df[,i2]-df[,i1]
试试这个不带循环的基本R解决方案。只需记住立柱的位置:

#Data
df <- as.data.frame(matrix(seq(1,20,1),nrow=4), byrow=TRUE)
colnames(df) <- c("X1","X2","X3","X4","X5")
rownames(df) <- as.Date(c("2020-01-02","2020-01-03","2020-01-04","2020-01-05"))
#Set columns for difference
df[,2:5] <- df[,2:5]-df[,1]
或者更复杂的方法是:

#Create index
#Var to substract
i1 <- which(names(df)=='X1')
#Vars to be substracted with X1
i2 <- which(names(df)!='X1')
#Compute
df[,i2]<-df[,i2]-df[,i1]
如果你想坚持Lappy,你可以这样做:

df[] <- lapply(df, `-`, df$X1)
df
#            X1 X2 X3 X4 X5
# 2020-01-02  0  4  8 12 16
# 2020-01-03  0  4  8 12 16
# 2020-01-04  0  4  8 12 16
# 2020-01-05  0  4  8 12 16
如果你想坚持Lappy,你可以这样做:

df[] <- lapply(df, `-`, df$X1)
df
#            X1 X2 X3 X4 X5
# 2020-01-02  0  4  8 12 16
# 2020-01-03  0  4  8 12 16
# 2020-01-04  0  4  8 12 16
# 2020-01-05  0  4  8 12 16
下面是grep的一种方法:

下面是grep的一种方法:

microbenchmark表示,这是所有测试中速度最快的一个,是6倍。数据帧越大,系数越大。当nrowdf==65536时,它会上升到30或45-50。microbenchmark说,这是所有测试中速度最快的6倍。数据帧越大,系数越大。当nrowdf==65536时,它上升到30或45-50。我的这个可能相关。我的这个可能相关。
i_col <- grep("X1", names(df))
df[] <- df - df[, i_col]
df
#           X1 X2 X3 X4 X5
#2020-01-02  0  4  8 12 16
#2020-01-03  0  4  8 12 16
#2020-01-04  0  4  8 12 16
#2020-01-05  0  4  8 12 16
sweep(df, 1, df[[i_col]], check.margin = FALSE)
#           X1 X2 X3 X4 X5
#2020-01-02  0  4  8 12 16
#2020-01-03  0  4  8 12 16
#2020-01-04  0  4  8 12 16
#2020-01-05  0  4  8 12 16