2016-07-15 32 views
0

以我的数据帧,我有一个包含一系列位置值的列中:滨值到因素

DistData$LOC=c(0,0,0,25,25,35,35,45,45,55,55,55,65,65,65,75,75,75,100,100,100,REF1,REF1,REF2,REf3,REF3,REF3) 

我想仓到这些因素,其中,值小于50是“接近”,50或更大是“FAR”并且所有REF *都是“REF”。

我已经试过转换为as.numeric(),然后切():

Zone = as.numeric(DistData$LOC) 
Zone = cut(Zone, c(0,50,200,NA),labels=c("NEAR","FAR","REF")) 

并试图一系列ifelse语句:

Zone = ifelse(Zone<50,"NEAR", ifelse(Zone>=50,"FAR", ifelse(is.na(Zone)<-"REF"))) 

还玩弄GSUB(),lapply ()和replace()没有成功。

任何援助将非常感激。

+0

尝试'as.numeric(as.character(())',而不仅仅是'as.numeric'。你强迫你的因素基础整数值,而不是它代表文本上的距离。 – Zelazny7

+0

是什么REF的含义?如果它意味着像“丢失的数据”,我会倾向于将REF转换为NA并将其他值转换为* ordered *因子类型,因为这些级别具有固有的顺序(Near Ben

回答

1

这里是产生你想要的结果更长的方法:

# convert to character vector 
temp <- as.character(DistData$LOC) 
# fill any refs with "999" 
temp[grep("REF", toupper(temp)) ] <- "999" 
# use cut to get desired categories 
cut(as.numeric(temp), breaks=c(0,50,100, 1000), labels=c("near", "far", "ref"), 
    include.lowest=T) 

这导致

[1] near near near near near near near near near far far far far far far far far far 
[19] far far far ref ref ref ref ref ref 
Levels: near far ref 
0

我喜欢@ LMO的解决方案,但这里的另一个使用bin_data()功能从mltools的。

library(mltools) 

# Build vector of values. I assume class(DistData$LOC) == "character" in your data.frame 
temp <- c(
    "0", "0", "0", "25", "25", "35", "35", "45", "45", "55", "55", 
    "55", "65", "65", "65", "75", "75", "75", "100", "100", "100", 
    "REF1", "REF1", "REF2", "REf3", "REF3", "REF3" 
) 

# Convert to numeric. REFs (and other non-numeric values will coerce to NA) 
temp_numeric <- as.numeric(temp) 

# Bin the values using "[left-closed, right-open)" bins 
binned_vals <- bin_data(temp_numeric, bins=c(-Inf, 50, Inf), boundaryType = "lcro)") 

# Insert a level for REF > all other levels 
levels(binned_vals) <- c(levels(binned_vals), "REF") 

# Locate REFs and set convert from NA to REF 
binned_vals[grep("REF", toupper(temp))] <- "REF" 

binned_vals 
[1] [-Inf, 50) [-Inf, 50) [-Inf, 50) [-Inf, 50) [-Inf, 50) [-Inf, 50) [-Inf, 50) [-Inf, 50) [-Inf, 50) [50, Inf) [50, Inf) [50, Inf) 
[13] [50, Inf) [50, Inf) [50, Inf) [50, Inf) [50, Inf) [50, Inf) [50, Inf) [50, Inf) [50, Inf) REF  REF  REF  
[25] REF  REF  REF  
Levels: [-Inf, 50) < [50, Inf) < REF