根据命名列表更新 dt 列
Update dt columns based on named list
比方说,我有以下 my_dt
数据表:
neutrons
spectrum
geography
2.30
-1.2
KIEL
2.54
-1.6
KIEL
2.56
-0.9
JUNG
2.31
-0.3
ANT
我还有以下命名列表 (my_list
):
> my_list
$particles
[1] "neutrons"
$station
[1] NA
$energy
[1] "spectrum"
$area
[1] "geography"
$gamma
[1] NA
此列表的值对应于我的数据集中的列名称(如果存在,如果不存在 - NA
)。
根据我的数据集和这个列表,我需要检查 my_dt
中存在哪些列并重命名它们(基于 my_list
名称),对于 NA
值 - 我需要创建填充的列NA
s.
所以,我想获取以下数据集:
>final_dt
particles
station
energy
area
gamma
2.30
NA
-1.2
KIEL
NA
2.54
NA
-1.6
KIEL
NA
2.56
NA
-0.9
JUNG
NA
2.31
NA
-0.3
ANT
NA
我尝试使用 apply family 函数来实现它,但目前我无法获得我想要的东西。
所以,如果有任何帮助,我将不胜感激!
data.table 使用 lapply
library(data.table)
setDT(my_dt)
setDT(my_list)
final_dt <- setnames( my_list[, lapply( .SD, function(x){
if( x %in% colnames(my_dt)){ my_dt[,x,with=F] }else{ NA } } ) ],
names(my_list) )
final_dt
particles station energy area gamma
1: 2.30 NA -1.2 KIEL NA
2: 2.54 NA -1.6 KIEL NA
3: 2.56 NA -0.9 JUNG NA
4: 2.31 NA -0.3 ANT NA
基础 R 使用 sapply
setDF(my_dt)
setDF(my_list)
data.frame( sapply( my_list, function(x) if(!is.na(x)){ my_dt[,x] }else{ NA } ) )
particles station energy area gamma
1 2.30 NA -1.2 KIEL NA
2 2.54 NA -1.6 KIEL NA
3 2.56 NA -0.9 JUNG NA
4 2.31 NA -0.3 ANT NA
数据
my_dt <- structure(list(neutrons = c(2.3, 2.54, 2.56, 2.31), spectrum = c(-1.2,
-1.6, -0.9, -0.3), geography = c("KIEL", "KIEL", "JUNG", "ANT"
)), class = "data.frame", row.names = c(NA, -4L))
my_list <- list(particles = "neutrons", station = NA, energy = "spectrum",
area = "geography", gamma = NA)
我写了一个简单的代码,应该可以为您完成这项工作:
l = list(c = 'cc', a = 'aa', b = NA) # replace this with your my_list
dt = data.frame(aa = 1:3, cc = 2:4) # replace this with my_dt
dtl = data.frame(l)
names(dt) = names(l)[na.omit(match(l, names(dt)))]
m = merge(dt, dtl[!is.element(names(dtl), names(dt))])
这可能无法满足您的需求,但由于我是单独提出的,所以我想分享一下以防万一。您可以使用 setnames
重命名基于 my_list
的列。之后,添加值为 NA
的缺失列名称。最后,如果需要,您可以使用 setcolorder
根据您的列表重新排序。
library(data.table)
my_vec <- unlist(my_list)
setnames(my_dt, names(my_vec[match(names(my_dt), my_vec)]))
my_dt[, (setdiff(names(my_vec), names(my_dt))) := NA]
setcolorder(my_dt, names(my_vec))
my_dt
输出
particles station energy area gamma
1: 2.30 NA -1.2 KIEL NA
2: 2.54 NA -1.6 KIEL NA
3: 2.56 NA -0.9 JUNG NA
4: 2.31 NA -0.3 ANT NA
比方说,我有以下 my_dt
数据表:
neutrons | spectrum | geography |
---|---|---|
2.30 | -1.2 | KIEL |
2.54 | -1.6 | KIEL |
2.56 | -0.9 | JUNG |
2.31 | -0.3 | ANT |
我还有以下命名列表 (my_list
):
> my_list
$particles
[1] "neutrons"
$station
[1] NA
$energy
[1] "spectrum"
$area
[1] "geography"
$gamma
[1] NA
此列表的值对应于我的数据集中的列名称(如果存在,如果不存在 - NA
)。
根据我的数据集和这个列表,我需要检查 my_dt
中存在哪些列并重命名它们(基于 my_list
名称),对于 NA
值 - 我需要创建填充的列NA
s.
所以,我想获取以下数据集:
>final_dt
particles | station | energy | area | gamma |
---|---|---|---|---|
2.30 | NA | -1.2 | KIEL | NA |
2.54 | NA | -1.6 | KIEL | NA |
2.56 | NA | -0.9 | JUNG | NA |
2.31 | NA | -0.3 | ANT | NA |
我尝试使用 apply family 函数来实现它,但目前我无法获得我想要的东西。
所以,如果有任何帮助,我将不胜感激!
data.table 使用 lapply
library(data.table)
setDT(my_dt)
setDT(my_list)
final_dt <- setnames( my_list[, lapply( .SD, function(x){
if( x %in% colnames(my_dt)){ my_dt[,x,with=F] }else{ NA } } ) ],
names(my_list) )
final_dt
particles station energy area gamma
1: 2.30 NA -1.2 KIEL NA
2: 2.54 NA -1.6 KIEL NA
3: 2.56 NA -0.9 JUNG NA
4: 2.31 NA -0.3 ANT NA
基础 R 使用 sapply
setDF(my_dt)
setDF(my_list)
data.frame( sapply( my_list, function(x) if(!is.na(x)){ my_dt[,x] }else{ NA } ) )
particles station energy area gamma
1 2.30 NA -1.2 KIEL NA
2 2.54 NA -1.6 KIEL NA
3 2.56 NA -0.9 JUNG NA
4 2.31 NA -0.3 ANT NA
数据
my_dt <- structure(list(neutrons = c(2.3, 2.54, 2.56, 2.31), spectrum = c(-1.2,
-1.6, -0.9, -0.3), geography = c("KIEL", "KIEL", "JUNG", "ANT"
)), class = "data.frame", row.names = c(NA, -4L))
my_list <- list(particles = "neutrons", station = NA, energy = "spectrum",
area = "geography", gamma = NA)
我写了一个简单的代码,应该可以为您完成这项工作:
l = list(c = 'cc', a = 'aa', b = NA) # replace this with your my_list
dt = data.frame(aa = 1:3, cc = 2:4) # replace this with my_dt
dtl = data.frame(l)
names(dt) = names(l)[na.omit(match(l, names(dt)))]
m = merge(dt, dtl[!is.element(names(dtl), names(dt))])
这可能无法满足您的需求,但由于我是单独提出的,所以我想分享一下以防万一。您可以使用 setnames
重命名基于 my_list
的列。之后,添加值为 NA
的缺失列名称。最后,如果需要,您可以使用 setcolorder
根据您的列表重新排序。
library(data.table)
my_vec <- unlist(my_list)
setnames(my_dt, names(my_vec[match(names(my_dt), my_vec)]))
my_dt[, (setdiff(names(my_vec), names(my_dt))) := NA]
setcolorder(my_dt, names(my_vec))
my_dt
输出
particles station energy area gamma
1: 2.30 NA -1.2 KIEL NA
2: 2.54 NA -1.6 KIEL NA
3: 2.56 NA -0.9 JUNG NA
4: 2.31 NA -0.3 ANT NA