Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用mutate_each将R中的一组行除以2_R_Dataframe_Dplyr - Fatal编程技术网

使用mutate_each将R中的一组行除以2

使用mutate_each将R中的一组行除以2,r,dataframe,dplyr,R,Dataframe,Dplyr,我有一个这样的数据框 Letter Number1 Number2 Number3 Type A 4 5 3 10 B 10 22 24 20 C 50 24 100 30 D 60 32 12 40 在这里,我想使用mutate_将数字1、数字2和数字3除以2,而不对字母和类型做任何操作。 有没

我有一个这样的数据框

Letter   Number1 Number2 Number3 Type
A           4      5        3      10
B           10     22       24     20
C           50     24       100    30
D           60     32       12     40
在这里,我想使用mutate_将数字1、数字2和数字3除以2,而不对字母和类型做任何操作。 有没有轻松的一天可以做到这一点

这就是我想要的最终DF的样子

Letter   Number1 Number2 Number3 Type
A           2      2.5     1.5     10
B           5      11       12     20
C           25     12       50    30
D           30     16       6     40

谢谢

我们可以使用
start\u with
matches
选择“Number”列,并将这些列除以2

library(dplyr)
mutate_each(df1, funs(./2), starts_with('Number'))
#    Letter Number1 Number2 Number3 Type
#1      A       2     2.5     1.5   10
#2      B       5    11.0    12.0   20
#3      C      25    12.0    50.0   30
#4      D      30    16.0     6.0   40
正如@Cotton.Rockwood在评论中建议的那样,在较新版本的
dplyr
0.7.6
)中,我们可以使用
mutate\u at
(用于更改列的子集)或
mutate\u all
(用于更改所有列)

或者使用
data.table
,我们将'data.frame'转换为'data.table'(
setDT(df1)
),获取以'Number'('nm1')开头的列名,用新值分配'nm1',即除以'2'后

library(data.table)#v1.9.4+
setDT(df1)
nm1 <- grep('^Number', names(df1), value=TRUE)
df1[, (nm1):= lapply(.SD, `/`, 2), .SDcols=nm1]
数据
df1我们可以使用
start\u with
matches
选择“Number”列,并将这些列除以2

library(dplyr)
mutate_each(df1, funs(./2), starts_with('Number'))
#    Letter Number1 Number2 Number3 Type
#1      A       2     2.5     1.5   10
#2      B       5    11.0    12.0   20
#3      C      25    12.0    50.0   30
#4      D      30    16.0     6.0   40
正如@Cotton.Rockwood在评论中建议的那样,在较新版本的
dplyr
0.7.6
)中,我们可以使用
mutate\u at
(用于更改列的子集)或
mutate\u all
(用于更改所有列)

或者使用
data.table
,我们将'data.frame'转换为'data.table'(
setDT(df1)
),获取以'Number'('nm1')开头的列名,用新值分配'nm1',即除以'2'后

library(data.table)#v1.9.4+
setDT(df1)
nm1 <- grep('^Number', names(df1), value=TRUE)
df1[, (nm1):= lapply(.SD, `/`, 2), .SDcols=nm1]
数据
df1A base
R
在以下情况下的解决方案:

indx <- grepl("Number", names(df))
df[indx] <- df[indx]/2L

 #>df
 #    Letter Number1 Number2 Number3 Type
 #1      A       2     2.5     1.5   10
 #2      B       5    11.0    12.0   20
 #3      C      25    12.0    50.0   30
 #4      D      30    16.0     6.0   40

indxA base
R
在以下情况下的解决方案:

indx <- grepl("Number", names(df))
df[indx] <- df[indx]/2L

 #>df
 #    Letter Number1 Number2 Number3 Type
 #1      A       2     2.5     1.5   10
 #2      B       5    11.0    12.0   20
 #3      C      25    12.0    50.0   30
 #4      D      30    16.0     6.0   40
indx
创建测试数据帧

letter <- c("A", "B", "C", "D")
n1 <- c(4, 10, 50, 60)
n2 <- c(5, 22, 24, 32)
n3 <- c(3, 24, 100, 12)
type <- c(10, 20, 30, 40)

df <- data.frame(letter, n1, n2, n3, type)
发挥自己的作用

mydivide <- function(x){x/2}
创建测试数据帧

letter <- c("A", "B", "C", "D")
n1 <- c(4, 10, 50, 60)
n2 <- c(5, 22, 24, 32)
n3 <- c(3, 24, 100, 12)
type <- c(10, 20, 30, 40)

df <- data.frame(letter, n1, n2, n3, type)
发挥自己的作用

mydivide <- function(x){x/2}

您可以使用基本R:
df[,grepl('Number',names(df))]=df[,grepl('Number',names(df))]/2
您可以使用基本R:
df[,grepl('Number',names(df))]=df[,grepl('Number',names(df))]/2
快速注意,
每种
都被弃用,现在被
全部
突变
突变
。在本例中,您将使用
mutate\u at
,并且需要使用
vars()
引用helper函数。新的正确dplyr代码将是:
mutate_at(df1,vars(以('Number'))开头),funs(./2))
请注意,
mutate_each
已被弃用,现在被
mutate_all
mutate_at
mutate_if
所取代。在本例中,您将使用
mutate\u at
,并且需要使用
vars()
引用helper函数。新的正确dplyr代码是:
mutate_at(df1,vars(以('Number')开头),funs(./2))
df <- mutate_each(df, funs(mydivide), -letter, -type)
# letter n1   n2   n3 type
# 1      A  2  2.5  1.5   10
# 2      B  5 11.0 12.0   20
# 3      C 25 12.0 50.0   30
# 4      D 30 16.0  6.0   40