根据值列表按比例填充列(可能会有所不同)

时间:2017-09-26 13:15:17

标签: r

根据值列表(可能会有所不同)按比例填充列 例:

  id <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  id <-  as.data.frame(id)

 names <- c("Jean", "Jules", "Lina")
 names <-  as.data.frame(names)

预期产出:

 id names
 1 Jean
 2 Jean
 3 Jean
 4 Jules
 5 Jules
 6 Jules
 7 Lina
 8 Lina
 9 Lina
 10 Lina

我必须使用此示例中的任何列表调整我的第二列值:

  id2 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11)
  id2 <-  as.data.frame(id2) 
  names2 <- c("Jean", "Jules", "Lina", "Fred")
  names2 <-  as.data.frame(names2)

预期产出:

  id2 names2
  1 Jean
  2 Jean
  3 Jean
  4 Jules
  5 Jules
  6 Jules
  7 Lina
  8 Lina
  9 Lina
 10 Fred
 11 Fred

怎么做?

2 个答案:

答案 0 :(得分:1)

首先,不要将你的矢量转换成数据框,真的没有必要这样做。
现在,以下函数返回与您的预期列匹配的向量,然后创建一个df。

fun <- function(x, y){
    m <- length(x)
    n <- length(y)
    new <- rep(y, each = round(m/n))
    if(m - n*round(m/n) > 0)
        new <- c(new, rep(y[n], m - n*round(m/n)))
    else
        new <- new[seq_len(m)]
    new
}

result1 <- data.frame(id, names1 = fun(id, names1))
result2 <- data.frame(id2, names2 = fun(id2, names2))

请注意,我已将向量names的名称更改为names1,因为names已经是base R函数。

答案 1 :(得分:1)

您可以通过将行数除以名称数来计算重复次数,然后使用tidyr::fill填充缺失值。

# Number of repetitions:
n <- nrow(id) %/% nrow(names)

# Repeat names
repnames <- rep(names$names, each = n)

# Make the names vector the same length as id
repnames <- repnames[1:nrow(id)]

# Change it to a data frame
repnames <- data.frame(names = repnames)

# Add id column
repnames$id <- id$id

# Fill the missing value
repnames <- tidyr::fill(repnames, names)

repnames
# 
#    names id
# 1   Jean  1
# 2   Jean  2
# 3   Jean  3
# 4  Jules  4
# 5  Jules  5
# 6  Jules  6
# 7   Lina  7
# 8   Lina  8
# 9   Lina  9
# 10  Lina 10