我有一个数据框这个数据框:
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))
没有工作,有什么想法?
答案 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()
。