以下是我正在处理的数据的迷你版本:
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]]))
}
}
循环永远不会结束。
答案 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