我有一个csv文件,其中的一小部分是
Optimal
value 7.35-7.45 4.5-8 5.6-7.9 0
ID V1 V2 V3 V4
1 7.1 5.5 7.6 218
10 7.8 4.8 6.3 407
50 7.12 5.2 5.4 140(数据更改了bcs。机密性)
总共有125个主题和大约50个变量
我需要为每个变量创建该值与范围之间的距离的绝对值。因此,例如对于ID 1:
V1dist = abs(7.1 - 7.35) = .25
V2dist = 0 because 4.5 < 5.5 < 8
V3dist = 0 because 5.6 < 7.6 < 7.9
V4dist = 218 because the optimal value is 0有些值在范围内-它们应该是0。有些更低,有些更高。
因此,我有两个问题: 1)如何读取数据2)如何创建新变量
我可以访问SAS和R(以及Excel,但是....)
发布于 2013-06-25 03:32:16
这里有一个解决方案。首先,我读取并格式化数据。我读取矩阵,跳过第一行(范围1),然后读取一行(这可以使用readLines进行优化)。
dat <- read.table(text='value 7.35-7.45 4.5-8 5.6-7.9 0
ID V1 V2 V3 V4
1 7.1 5.5 7.6 218
10 7.8 4.8 6.3 407
50 7.12 5.2 5.4 140',header=TRUE,skip=1)
mm <- as.matrix(dat[,-1])
rownames(mm) <- dat[,1]
rngs <- read.table(text='value 7.35-7.45 4.5-8 5.6-7.9 0
ID V1 V2 V3 V4
1 7.1 5.5 7.6 218
10 7.8 4.8 6.3 407
50 7.12 5.2 5.4 140',nrows=1)
rngs <- lapply(unclass(rngs[1,-1]),
function(x)as.numeric(unlist(strsplit(as.character(x),'-'))))
names(rngs) <- colnames(mm)
mm
V1 V2 V3 V4
1 7.10 5.5 7.6 218
10 7.80 4.8 6.3 407
50 7.12 5.2 5.4 140
> rngs
$V1
[1] 7.35 7.45
$V2
[1] 4.5 8.0
$V3
[1] 5.6 7.9
$V4
[1] 0然后我将值与范围进行比较。我循环遍历每一列,并使用嵌套的ifelse计算范围。注意,在没有范围的情况下,我重复相同的值。
sapply(names(rngs),function(x)
{
vec <- mm[,x]
inter <- rngs[[x]]
if(length(inter)==1) inter <- rep(inter,2)
## within interval
ifelse(mm[,x] < inter[2] & mm[,x] > inter[1],
0,ifelse(mm[,x] > inter[2], mm[,x]-inter[2], inter[1]-mm[,x]))
})
V1 V2 V3 V4
1 0.25 0 0.0 218
10 0.35 0 0.0 407
50 0.23 0 0.2 140https://stackoverflow.com/questions/17282855
复制相似问题