如何通过赔率和偶数标准按位置用列表值填充两个不同的列

How do I fill two different columns with list values by position via odds and even criteria

我想从包含此类数据的列表创建数据框:

names_values <- list("Name1", 22, "Name2", 18, "Name3", 10, "Name4", 16)

看到22是"Name1"的补码,18是"Name2"的补码,10是"Name3"的补码。如果我想在数据框中转换此列表,输出必须显示 4 x 2 数据框。我认为它的工作方式是将偶数放在第一列,将赔率放在第二列。我创建了以下脚本:

library(dplyr)

names_values <- list("Name1", 22, "Name2", 18, "Name3", 10)

even <- function(x){
  x %% 2 == 0
}

odd <- function(x){
  x %% 2 != 0
}

pileUp <- function(names_values){
  temp <- data.frame()
  df <- data.frame()
  for(i in 1:length(names_values)){
    if(even(i)){
      temp$names <- names_values[i]
    }
    else if(odd(i)){
      temp$values <- names_values[i]
    }
    df <- rbind(df, temp)
  }
}

pileUp(names_values)

我得到的结果是这样的:

Error in `$<-.data.frame`(`*tmp*`, "values", value = list("Name1")) : 
  replacement has 1 row, data has 0

我该怎么办?也许 rbindlist 而不是 rbind?我相信算法逻辑也是有缺陷的。

谢谢大家

你应该在你的原始列表上使用子集,在把它变成一个向量之后:

#turn from list into vector
names_values <- unlist(names_values)

#subset odd
names <- names_values[seq(1,length(names_values),2)]

#subset even
numbers <- names_values[seq(2,length(names_values),2)]

#turn into dataframe

data <- data.frame(names = names, numbers = numbers)

split拆分成属于每一行的元组,然后用rbindlist或类似的绑定元组:

s = split(names_values, rep(1:4, each=2))
data.table::rbindlist(s)

      V1 V2
1: Name1 22
2: Name2 18
3: Name3 10
4: Name4 16

或者在基地...

setNames(do.call(rbind.data.frame, s), c("Name", "Value"))

   Name Value
1 Name1    22
2 Name2    18
3 Name3    10
4 Name4    16

这是一个可以在一行中完成的两行基础 R 方法。

# get vector of positions
pos <- seq_along(names_values)
# use vector as logical with modulus 2 (%% 2) to index properly
data.frame(name=unlist(names_values[as.logical(pos %% 2)]),
           vals=unlist(names_values[!(pos %% 2)]))
   name vals
1 Name1   22
2 Name2   18
3 Name3   10
4 Name4   16