我是R的新手,我想知道如何通过在数据框中循环两个变量来创建新变量。
我试图通过使用两个变量对数据框进行突变,我使用mutate函数编写了代码,并且仅需几列就可以正常工作。
{
when (requestCode) {
REQ_WIFI_STATE -> {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
Log.d("DEBUG#", "Got wifi permission")
connectToIRHub()
} else {
Log.d("DEBUG#", "Wifi permission DENIED") // This block is run every time
}
}
else -> super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
}
但是我需要更改更多的列,并且想使代码更简单。我尝试查找“ for循环”和df
n sd2_t sd1_t sd2neg_t sd1neg_t
1 20 22 10 11
2 25 26 20 22
3 30 33 15 12
df2<-df%>%
dplyr::mutate(sd2_s=sd2_t*n,
sd1_s=sd1_t*n,
sd2neg_s=sd2neg_t*n,
sd1neg_s=sd1neg_t*n)
Expected output
n sd2_t sd1_t sd2neg_t sd1neg_t sd2_s sd1_s sd2neg_s sd1neg_s
1 20 22 10 11 20 22 10 11
2 25 26 20 22 50 52 40 44
3 30 33 15 12 90 99 45 36
函数,但无法自己解决问题,需要帮助。
答案 0 :(得分:2)
由于这只是每行的向量化操作,因此无需显式循环。
只需将数据集的整个块相乘,然后稍微重命名即可分配给新列:
dat[sub("_t$", "_s", names(dat[-1]))] <- dat[-1] * dat$n
dat
# n sd2_t sd1_t sd2neg_t sd1neg_t sd2_s sd1_s sd2neg_s sd1neg_s
#1 1 20 22 10 11 20 22 10 11
#2 2 25 26 20 22 50 52 40 44
#3 3 30 33 15 12 90 99 45 36
dat
所在的位置:
dat <- read.table(text="n sd2_t sd1_t sd2neg_t sd1neg_t
1 20 22 10 11
2 25 26 20 22
3 30 33 15 12", header=TRUE)
答案 1 :(得分:2)
使用dplyr
,我们可以使用mutate_at
选择以"t"
结尾的列,并将每个列与n
相乘。
library(dplyr)
df %>%
mutate_at(vars(ends_with("t")), list(s = ~. * n))
# n sd2_t sd1_t sd2neg_t sd1neg_t sd2_t_s sd1_t_s sd2neg_t_s sd1neg_t_s
#1 1 20 22 10 11 20 22 10 11
#2 2 25 26 20 22 50 52 40 44
#3 3 30 33 15 12 90 99 45 36
由于您已经有@thelatemail提供的矢量化解决方案,因此不是必需的,但是由于您尝试使用lapply
的一种方法是
df[sub("_t$", "_s", names(df[-1]))] <- lapply(df[-1], `*`, df$n)