数据帧列表中列的绝对值

时间:2017-04-17 17:58:31

标签: r

我删除了以下列表元素:

head(roc.split[[17]][3])

      SCORE
23514   0.0
22298  0.01
22314  0.01
22429  0.01
22240 -0.02
22592 -0.04

我想要获取SCORE的绝对值 - 仅适用于这一个元素。但是当我做以下事情时:

abs(roc.split[[17]][3])
  

Math.data.frame中的错误(roc.split [[17]] [3]):         数据框中的非数字变量:SCORE

这似乎是因为SCORE被归类为角色:

summary(roc.split[[17]][3])
    SCORE          
 Length:668        
 Class :character  
 Mode  :character

但是以下内容也不起作用:

abs(as.numeric(roc.split[[17]][3]))
  

错误:(list)对象无法强制键入'double

所以我猜我的问题是 - 如何在这个特定的列表元素中获取SCORE列的绝对值?

感谢。

1 个答案:

答案 0 :(得分:1)

发生第二个错误是因为您尝试将整个数据帧转换为数字。

#Dummy Data
dput(d1)
structure(list(v1 = c("1", "2", "-4", "-5", "8")), .Names = "v1", row.names = c(NA, 
-5L), class = "data.frame")

abs(d1)
  

Math.data.frame(d1)中的错误:数据框中的非数字变量:v1

as.numeric(d1)
  

错误:( list)对象无法强制输入'double'

要使其发挥作用,您可以在向量SCORE上调用它(在本例中为v1),或使用transform将其转换为数字,即

abs(as.numeric(d1$v1))
#[1] 1 2 4 5 8

abs(transform(d1, v1 = as.numeric(v1)))
#  v1
#1  1
#2  2
#3  4
#4  5
#5  8

注意:将数据框转换为数字(来自字符)的正确方法是

d1[] <- lapply(d1, as.numeric)

如果您有要转换为数字的列表,那么

l1 <- list(d1, d1, d1)
l1 <- lapply(l1, function(i){i[] <- lapply(i, as.numeric); i})

#and to get the absolut values of all data frames in l1 then simply,
l1 <- lapply(l1, abs)

#Or All in one go,
l1 <- lapply(l1, function(i) {i[] <- lapply(i, as.numeric); abs(i)})