使用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 baseR
在以下情况下的解决方案:
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 baseR
在以下情况下的解决方案:
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