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

问题描述 投票:1回答:3

我有这样的数据框

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_each将number1,number2和number3除以2,而不对Letter和type做任何事情。有一个轻松的一天这样做吗?

这就是我希望最终的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

谢谢!

r dataframe dplyr
3个回答
5
投票

我们可以使用starts_withmatches选择'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在评论中建议的那样,在较新版本的dplyr0.7.6)中,我们可以使用mutate_at(用于更改列的子集)或mutate_all(用于更改所有列)

df1 %>%
   mutate_at(vars(starts_with("Number")), funs(./2))

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

library(data.table)#v1.9.4+
setDT(df1)
nm1 <- grep('^Number', names(df1), value=TRUE)
df1[, (nm1):= lapply(.SD, `/`, 2), .SDcols=nm1]

或者使用data.tableset更有效的方法。

for(j in nm1){
  set(df1, i=NULL, j=j, value=df1[[j]]/2)
}

data

 df1 <-  structure(list(Letter = c("A", "B", "C", "D"), Number1 = c(4L, 
 10L, 50L, 60L), Number2 = c(5L, 22L, 24L, 32L), Number3 = c(3L, 
 24L, 100L, 12L), Type = c(10L, 20L, 30L, 40L)), .Names = c("Letter", 
 "Number1", "Number2", "Number3", "Type"), class = "data.frame",
 row.names = c(NA, -4L))

4
投票

以下基础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

1
投票
library(dplyr)

创建测试数据帧

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)

数据帧df:

# letter n1 n2  n3 type
# 1      A  4  5   3   10
# 2      B 10 22  24   20
# 3      C 50 24 100   30
# 4      D 60 32  12   40

做你自己的功能

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

使用funds()告诉mutate使用什么函数。

使用' - '告诉mutate不要改变列'letter'和'type'

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
© www.soinside.com 2019 - 2024. All rights reserved.