如何使新变量遍历数据帧中的两个变量

时间:2019-06-05 00:07:20

标签: r

我是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 函数,但无法自己解决问题,需要帮助。

2 个答案:

答案 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)