如何使用sapply为每一列划分不同的行

时间:2018-08-07 21:24:48

标签: r row sapply notation

我在R上有些新手,但是我尝试使用sapply做一些非常简单的事情,因为我将需要做很多事情。假设您在5年内有很多变量,并且想一次将每个列的第五行的值除以第一行的值。

a   b   c     
184 20  55
100 32  563
18  12  88
5   99  52
32  36  22 

到目前为止,我可以一一完成:

df$a<-(df[5,]$a/df[1,]$a)

或者如果我尝试使用sapply:

df2<-data.frame(sapply(names(df)[-1], function(x) {
   (df[x]/df[x])
   }))

问题是我不知道如何用sapply来表示行,所以上面我只是将var自己除。最快的方法是什么?谢谢!

3 个答案:

答案 0 :(得分:0)

对于此任务,您不需要sapply而是

df[5, ] <- df[5, ] / df[1, ]
df
#           a    b     c
#1 184.000000 20.0  55.0
#2 100.000000 32.0 563.0
#3  18.000000 12.0  88.0
#4   5.000000 99.0  52.0
#5   0.173913  1.8   0.4

请参阅@ Mako212的注释,如果您的数据包含非数字列,则可以首先创建逻辑矢量,该逻辑矢量在数据包含数字列的位置为TRUE。将其用于列子设置,然后进行操作。

col_idx <- sapply(df, is.numeric)
df[5, col_idx] <- df[5, col_idx] / df[1, col_idx]

答案 1 :(得分:0)

如果您有混合类型的列,这是一种class Navigation extends Component{ render(){ return ( <div className="left-navigation"> <ul> <Link to='/dashboard'><li>Home</li></Link> <Link to='/create-seedz'><li>Create Seedz</li></Link> <Link to='/create-promotion'><li>Create Promotion</li></Link> <Link to='/setting'><li>Setting</li></Link> <SignOutButton user={this.props.user} signedOut={this.props.signedOut} authed={this.props.authed}/> </ul> </div> ); } } 方法

dplyr

样本数据

library(dplyr)
df %>% mutate_if(is.numeric, function(x) replace(x, length(x), x[length(x)] / x[1]))
#           a    b     c d e
#1 184.000000 20.0  55.0 a A
#2 100.000000 32.0 563.0 b B
#3  18.000000 12.0  88.0 c C
#4   5.000000 99.0  52.0 d D
#5   0.173913  1.8   0.4 e E

答案 2 :(得分:0)

这可能是一个很好的功能:

library(dplyr)

div_row <- function(data, numerator, denominator){
    data %>% mutate_if(is.numeric, funs(if_else(row_number() == numerator, .[numerator]/.[denominator], .)))
}

df %>% div_row(5,1)
#     a      b     c    d    
# 1 184      20    55   a
# 2 100      32   563   a    
# 3  18      12    88   c    
# 4   5      99    52   e    
# 5   0.174   1.8   0.4 t  

df %>% div_row(2,1)
#     a      b     c    d 
# 1 184      20    55   a    
# 2   0.543   1.6  10.2 a 
# 3  18      12    88   c
# 4   5      99    52   e  
# 5  32      36    22   t