使用向量

时间:2015-06-22 02:09:54

标签: r dataframe

我有一个data.frame例如:

d <- read.table(text='   V1 V2  V3  V4  V5  V6  V7
1 1 a 2 3 4 9 6
2 1 b 2 2 4 5 NA
3 1 c 1 3 4 5 8
4 1 d 1 2 3 6 9
5 2 a 1 2 3 4 5
6 2 b 1 4 5 6 7
7 2 c 1 2 3 5 8
8 2 d 2 3 6 7 9', header=TRUE)

现在我想取一行,例如第一行(1a)和:

  1. 从该行获取最小值和最大值。在这种情况下,min = 2和max = 9(注意,它们之间存在缺失值,例如该行中没有5,7或8)。

  2. 现在我想用所有缺失的值替换该行并对其进行扩展(该行将比其他所有行长,因为它将从2到9(2,3,4,5,6,7, 8,9)。然后,整个data.frame应该被NA列自动扩展为其他行,而不是我替换的行。

  3. 我尝试了一种矢量方法,但我几乎陷入困境。这就是我到目前为止所做的:

    vec.one_ <- d[1,]
    vec.one <- as.vector(vec.one_[3:length(vec.one_)])
    min.one <- min(vec.one, na.rm=T)
    max.one <- max(vec.one, na.rm=T)
    new.one <- as.numeric(vector(,length(vec.one)))
    for(i in 1:length(new.one)){
      new.one[i] <- NA
    }
    

    我尝试将行提取为矢量来操纵它,然后将其重新插入。我不确定是否有效。

    一旦第一行被替换,这应该是data.frame,整个data.frame自动扩展为NA:

    d <- read.table(text='   V1 V2  V3  V4  V5  V6  V7 V8 V9 V10
    1 1 a 2 3 4 5 6 7 8 9
    2 1 b 2 2 4 5 NA NA NA NA
    3 1 c 1 3 4 5 8 NA NA NA
    4 1 d 1 2 3 6 9 NA NA NA
    5 2 a 1 2 3 4 5 NA NA NA
    6 2 b 1 4 5 6 7 NA NA NA
    7 2 c 1 2 3 5 8 NA NA NA
    8 2 d 2 3 6 7 9 NA NA NA', header=TRUE)
    

1 个答案:

答案 0 :(得分:2)

第一步是计算要更改的行的新值:

row.to.change <- 1
(new.row <- seq(min(d[row.to.change,c(-1, -2)], na.rm=TRUE), max(d[row.to.change,c(-1,-2)], na.rm=TRUE)))
# [1] 2 3 4 5 6 7 8 9

然后我会将数据框扩展到正确的大小:

(num.add <- length(new.row) - ncol(d) + 2)
# [1] 3
if (num.add > 0) {
  d <- cbind(d, replicate(num.add, rep(NA, nrow(d))))
} else if (num.add <= 0) {
  new.row <- c(new.row, rep(NA, -num.add))
}

最后,我会替换感兴趣的行中的元素:

d[row.to.change,c(-1, -2)] <- new.row
d
#   V1 V2 V3 V4 V5 V6 V7  1  2  3
# 1  1  a  2  3  4  5  6  7  8  9
# 2  1  b  2  2  4  5 NA NA NA NA
# 3  1  c  1  3  4  5  8 NA NA NA
# 4  1  d  1  2  3  6  9 NA NA NA
# 5  2  a  1  2  3  4  5 NA NA NA
# 6  2  b  1  4  5  6  7 NA NA NA
# 7  2  c  1  2  3  5  8 NA NA NA
# 8  2  d  2  3  6  7  9 NA NA NA