如何将函数仅应用于R中数据框中的数字字段(不包括标题)

时间:2015-01-21 22:44:24

标签: r

我有一个数据框这个数据框:

    structure(list(Time = structure(1:3, .Label = c("1/13/15 12:14 PM", 
"1/13/15 13:14 PM", "1/13/15 14:14 PM"), class = "factor"), Server1 = structure(1:3, .Label = c("3", 
"5", "7"), class = "factor"), Server2 = structure(1:3, .Label = c("0", 
"1.3", "34"), class = "factor")), .Names = c("Time", "Server1", 
"Server2"), row.names = c(NA, -3L), class = "data.frame")

我需要全局地将舍入函数应用于所有数据点,不包括标题和日期时间格式化数据点:

我试过了:

sapply(df, function(x) round(df[,2:ncol(x)],2))

没有工作,有什么想法?

3 个答案:

答案 0 :(得分:4)

由于您已经获得了所有因子列,因此您可能需要手动确定要转换的列。这是我们可以用来将因子转换为原始数值的函数。这使用了help(factor)警告部分中描述的推荐方法。

f <- function(x) as.numeric(levels(x))[x]

接下来,我们可以将此函数应用于所需的列并同时对其进行舍入。在这种情况下,我们希望将f()应用于除第一列之外的每个列,因此我们使用索引[-1]

df[-1] <- lapply(df[-1], function(x) round(f(x), 2))
df
#               Time Server1 Server2
# 1 1/13/15 12:14 PM       3     0.0
# 2 1/13/15 13:14 PM       5     1.3
# 3 1/13/15 14:14 PM       7    34.0

检查生成的列类:

sapply(df, class)
#     Time   Server1   Server2 
# "factor" "numeric" "numeric" 

答案 1 :(得分:3)

如果您要执行的操作是围绕numeric的所有列,而不事先手动检查哪些列为numeric且未指定特定列号:

idx <- sapply(df, class)=="numeric"
df[, idx] <- lapply(df[, idx], round)

当然,假设所有相关列已经numeric,而不是character数字,factor等。

答案 2 :(得分:1)

我偷了你的一些数据,因为你提供的数据都很复杂。

x <- c("1/13/15 1:14 PM", "1/13/15 10:14 PM", "1/13/15 11:14 PM", 
       "1/13/15 12:14 PM", "1/13/15 2:14 PM")
y <- c("0%", "0.08%", "0.17%", "0.25%", "0.33%")
z <- c("0", "0.08333", "0.16667", "0.25", "0.33333")

dF <- data.frame(x, y, z)

从值中删除%符号并转换为数字:

dF$y <- as.numeric(gsub("%", "", dF$y))

将您的第三列转换为数字和舍入:

dF$z <- round(as.numeric(as.character(dF$z)), 2)

编辑以回应您的评论:

显然,我很困惑。舍入对数字而非字符有意义。您必须先将您感兴趣的列转换为数字,然后再进行舍入。

将它们转换为numeric值后,只需使用:

dF[,-1] <-round(dF[,-1], 2) # The -1 excludes column 1
dF
                 x    y    z
1  1/13/15 1:14 PM 0.00 0.00
2 1/13/15 10:14 PM 0.08 0.08
3 1/13/15 11:14 PM 0.17 0.17
4 1/13/15 12:14 PM 0.25 0.25
5  1/13/15 2:14 PM 0.33 0.33

没有必要担心您要对数据框的名称进行舍入。你不会。但是我很确定你必须将你的因子/字符转换成数字然后再舍入它们。如果我错了,我相信其他SO用户都会教育我们两个。

使用原始帖子中的新数据进行编辑:

当您尝试舍入因子时,您将收到错误:

 dF <- structure(list(Time = structure(1:3, .Label = c("1/13/15 12:14PM",
                 "1/13/15 13:14 PM", "1/13/15 14:14 PM"), class = 
                 "factor"), Server1 = structure(1:3, .Label = c("3", 
                  "5", "7"), class = "factor"), Server2 = structure(1:3, 
                  .Label = c("0", "1.3", "34"), class = "factor")), Names 
                  = c("Time", "Server1", "Server2"), row.names = c(NA, 
                  -3L), class = "data.frame")
dF[,-1] <-round(dF[,-1], 0) # The -1 excludes column 1
Error in Math.data.frame(list(Server1 = 1:3, Server2 = 1:3), 0) : 
non-numeric variable in data frame: Server1Server2

必须将因子转换为数字,然后才能得到上述错误:

dF[, 2] <- as.numeric(as.character(dF[, 2]))
dF[, 3] <- as.numeric(as.character(dF[, 3]))
dF[,-1] <-round(dF[,-1], 0) # The -1 excludes column 1
dF
              Time Server1 Server2
1 1/13/15 12:14 PM       3       0
2 1/13/15 13:14 PM       5       1
3 1/13/15 14:14 PM       7      34

round()语句不会挂起“标题”。但是你必须先将你的因子转换成数字才能round()