如何通过赔率和偶数标准按位置用列表值填充两个不同的列
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
我想从包含此类数据的列表创建数据框:
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