如何根据一列中的值使用重复来更新多行?

时间:2019-04-05 00:08:28

标签: r dataframe

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

我应该补充一点,这跨越了数千行数据。 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"

3 个答案:

答案 0 :(得分:0)

这是将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)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

更新以匹配OP的编辑

使用base 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建议加入的示例表会有所帮助吗?