【问题标题】:Dynamically replace row in dataframe with vector用向量动态替换数据框中的行
【发布时间】:2015-09-07 09:23:44
【问题描述】:

我有一个 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 列,用于其他行,而不是我替换的行。

我尝试了矢量方法,但我几乎被卡住了。这是我到目前为止所做的:

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)

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

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

    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
    

    【讨论】:

    • 您好,谢谢!要扩展数据框,+2 意味着您添加它们,因为您之前删除了前两列?
    • @LillyKuil 您正在替换元素 3 及以后的元素,因此您不计算当前宽度的前两列。
    • 是否也可以以相同的方式计算标题?在您的示例中,新列有一个新索引 1,2,3 - 是否有可能使它们成为 V8 V9 V10? (当然取决于新列的数量)?
    • @LillyKuil 最后你可以做colnames(d) &lt;- paste0("V", seq_len(ncol(d)))
    • 当我将以下行应用于具有 5000 列的 data.frame 时:(new.row
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多