R - 操作data.frame中的列,通过将字符转换为数字来消除删失值

时间:2016-07-20 19:10:13

标签: r dataframe

以下是我正在处理的数据的迷你版本:

columnNum <- c("G1", "G2", "G3")
Al <- c("<5", 6, 7, "<4", 5, 6)
Ca <- c(9, 10, 11,10, 11, 12)
df <- data.frame(columnNum, Al, Ca, stringsAsFactors = FALSE)

目前每列的类是字符,字符,数字(按顺序,从左到右),因为有些值被删除(包含&#34;&lt;&#34;)

我要做的是替换&#34; Al&#34;中的值。包含实际数值而不是字符串的列。我确信我能找到一种方法只为一个列做这个但我的问题是,实际上,我有20个不同的列,而不是2.我需要遍历每一列(来自列&#34; Al&#34; to&#34; Zn&#34;),检查值是否被审查,如果是,则去掉&#34;&lt;&#34;并将其转换为数字。

我还很新,所以这就是我尝试做的事情(根据我的大数据,而不是这个小数据):

for(i in df$Al:df$Zn)
{
   if (class(df[[i]]) != numeric)
   {
      df[[i]] <-  as.numeric(gsub(pattern = "<", replacement =    
      "", df[[i]])) 
   }
}

循环永远不会结束。

2 个答案:

答案 0 :(得分:1)

我们应该首先找到要调整的列。我们会根据您的说明将其作为for (i in Samples){ assign(paste0("Mean_",i),mean(get(paste0("Sample_",i)))) } Al的列。接下来,我们Zn个不必要的字符,并使用sub函数转换为numeric。我添加了更多列以显示复杂性:

numerize

数据

cols <- match("Al", names(df)):match("Zn", names(df))
numerize <- function(x) as.numeric(sub(".*?([0-9.-]+).*", "\\1", x))

#base R
df[cols] <- lapply(df[cols], numerize)

#dplyr
df %>% mutate_at(vars(Al:Zn), numerize)

#data.table
setDT(df)[, (names(df)[cols]) := lapply(.SD, numerize), .SDcols=cols][]

#   columnNum Al Yw Zn Ca
# 1        G1  5  8  1  9
# 2        G2  6  6  6 10
# 3        G3  7  7  7 11
# 4        G1  4  4  4 10
# 5        G2  5  5  5 11
# 6        G3  6  6  6 12

答案 1 :(得分:0)

tidyr::extract_numeric非常方便,无论是dplyr还是

df$Al <- tidyr::extract_numeric(Al)    # or df %>% mutate(Al = extract_numeric(Al))

大致相当于

df$Al <- as.numeric(sub('.*(-?[0-9]+.?[0-9]*).*', '\\1', df$Al))

对于这种特殊情况可以简化为:

df$Al <- as.integer(sub('<', '', df$Al))

无论您使用哪种,您都可以获得以下数据:

##   columnNum Al Ca
## 1        G1  5  9
## 2        G2  6 10
## 3        G3  7 11
## 4        G1  4 10
## 5        G2  5 11
## 6        G3  6 12