我在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自己除。最快的方法是什么?谢谢!
答案 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