我使用列名称向量来选择data.table的列的子集.我有这个想法,是否可以基本上定义条件,i然后将条件应用于所有选定的列.例如,使用mtcars数据集.我想选择气缸和齿轮柱,然后想要过滤所有有四个气缸和四个齿轮的车.当然,我还需要确定它是否and或or用于过滤器,但我只是有兴趣,如果能以某种方式在应用理念data.table方面.
# working code
sel.col <- c("cyl", "gear")
dt <- data.table(mtcars[1:4,])
dt[, ..sel.col]
dt[cyl == 4 & gear == 4, ..sel.col]
# Non-working code
dt[ sel.col == 4 , ..sel.col]
Run Code Online (Sandbox Code Playgroud) 为了使我的函数更加安全,我需要创建一个空的data.table,它具有特定数量的列和预定义的 data.type。这是为了允许稍后调用,dplyr::union即使 data.table 为空。
因此,我想创建一个空的data.table并直接定义列的数据类型。这适用于数字或字符列,但不适用于日期列。
我通过使用 data.table FAQ 中的条目 2.4 找到了一个可能的解决方案,但首先用错误的值填充 data.table 然后再删除它们似乎有点奇怪。常见问题2.4
复制问题的代码:
library(data.table)
library(dplyr)
dt.empty <- data.table("Date" = character()
, "Char.Vector" = character()
, "Key.Variable" = character()
, "ExchangeRate" = numeric()
)
dt.Union <- data.table( "Date" = as.Date(c("2000-01-01", "2001-01-01"))
, "Char.Vector" = as.character(c("a", "b"))
, "Key.Variable" = as.character(c("x1", "x2"))
, "ExchangeRate" = as.numeric(c(2,1.4))
)
dplyr::union(dt.Union
, dt.empty)
Error: not compatible:
- Incompatible type for column `Date`: x Date, y character
- Incompatible type …Run Code Online (Sandbox Code Playgroud) 基本上是这个问题的扩展,因为我注意到,如果你第二次进行子集化,就不可能改变列的值.
random.length <- sample(x = 15:30, size = 1)
dt <- data.table(city=sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"), size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE))
set.seed(1)
dt[sample(.N,3), score :=9999]
set.seed(1)
dt[sample(.N,3),]
Run Code Online (Sandbox Code Playgroud)
这可以按预期工作,并将三个随机选择的城市的分数更改为9999.虽然如果您在第一步中进行分组,然后进行采样并尝试分配新的分数值,那么这是不可能的.
set.seed(1)
dt[city == "New York",][sample(.N,1), score := 55555]
set.seed(1)
dt[city == "New York",][sample(.N,1)]
Run Code Online (Sandbox Code Playgroud)
我想要实现的是,我可以更改某个列的值,该列是某个子集的一部分,并从该子集中随机选择.
目前正致力于了解dplyr和整体tidyverse更好,现在我偶然发现了多种方式存储mutate呼叫结果.我想知道添加额外列的可能方法之一是更好还是更差.
library(data.table)
library(dplyr)
dt <- structure(list(obs = c("1953M04", "1953M05", "1953M06", "1953M07", "1953M08", "1953M09", "1953M10", "1953M11", "1953M12", "1954M01")
, gs1 = c(2.35999989509583, 2.48000001907349, 2.45000004768372, 2.38000011444092, 2.27999997138977, 2.20000004768372, 1.78999996185303,
1.66999995708466, 1.6599999666214, 1.4099999666214)), row.names = c(NA, -10L), class = c("data.table", "data.frame"))
# Data.Table approach
dt[, Date.Month := as.Date(paste0(obs,"-01"), format = "%YM%m-%d")]
# dplyr-way in a logic way at the end of the pipe
dt %>% mutate( Date.Month = as.Date(paste0(obs,"-01"), format = "%YM%m-%d")) %>% {. ->> dt } …Run Code Online (Sandbox Code Playgroud)