【问题标题】:How to update multiple rows with repeats based on values in one column?如何根据一列中的值更新多行重复?
【发布时间】:2019-04-05 00:08:28
【问题描述】:

我有一个需要覆盖 NA 数据的网站图像指标数据集。以前,我在website_index 上加入了两个表。但是,现在我需要返回并为多行添加多列数据。我不确定我是否可以再次加入表格(由于某些数据已经存在,它会创建重复吗?)我应该使用其他方法吗?

我应该补充一点,这跨越了 1000 行数据。 website_index 被重复多次,我试图添加 20 多列值。所以我不想使用c() 手动将列​​值添加到行中,因为我可能会复制所有值的错误。

我正在尝试更新的数据集示例

website_index metric1 metric2
1               NA      NA
2               NA      NA
3              "red"    "green"
4              "blue"   "green"

希望数据集看起来像这样

website_index metric1 metric2
1              "value1"   "value2"
2              "value3"   "value4"
3              "red"    "green"
4              "blue"   "green"

【问题讨论】:

  • 您可能希望使用一些有关导致所需输出的规则的信息来完成示例。也许您有另一个表要显示与此示例匹配(因为您提到了联接)?

标签: r dataframe


【解决方案1】:

对于需要内存和速度的超大数据集,使用data.table 的以下解决方案应该更快。对于正常情况,请使用@www

的解决方案
library(data.table)
setDT(dat)
for (j in names(dat)) set(dat, which(is.na(dat[[j]])), j, "value")

【讨论】:

  • 谢谢!我意识到我的问题措辞含糊,他们都说“价值” - 我需要在列中添加多个不同的值,所以这对我不起作用。
【解决方案2】:

这是一种将NA 替换为"value" 的方法。

dat[is.na(dat)] <- "value"
dat
#   website_index metric1 metric2
# 1             1   value   value
# 2             2   value   value
# 3             3     red   green
# 4             4    blue   green`

数据

dat <- read.table(text = "website_index metric1 metric2
1               NA      NA
                  2               NA      NA
                  3              'red'    'green'
                  4              'blue'   'green'",
                  header = TRUE, stringsAsFactors = FALSE)

【讨论】:

    【解决方案3】:

    更新以匹配 OP 的编辑

    使用基础 for 循环的解决方案。

    #example data frame
    x <-  data.frame(web = c(1,2,3,4), metrc = c(NA,NA,'red','blue'), metrc2 = c(NA, NA, 'green','green'), stringsAsFactors = FALSE)
    
    
    #initializing empty vector
    l <- c()
    
    #creating "value" with a count of NAs in data frame
    for(i in 1:sum(is.na(x))){
        l[[i]] <- paste0('value',i)
     }
    
    #nested for loop that check each row, column, fills in first item from the vector
    #to the NA, and removes item from vectors.
    
    for(i in 1:nrow(x)){
      for(j in 1:ncol(x)){
        if(is.na(x[i,j])) {
    
          x[i,j] <- l[[1]]
          l <- l[l!=l[1]]
    
        }
      }
    }
    

    这是最有效的方法吗?疑。但是,当您提到加入表格时,我不确定这是否能回答您的真实问题。也许按照@Frank 的建议添加一个您想要加入的示例表会有所帮助?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多