我喜欢在飞行中重命名一个矢量 setNames(通过动态我的意思是一个返回对象的函数):
my_vector <- c(1,2,3)
setNames(my_vector, c("a","b","c"))
# a b c
# 1 2 3
Run Code Online (Sandbox Code Playgroud)
这也适用于数据框列名
my_df <- data.frame(matrix(1:9, nrow=3))
setNames(my_df, c("a","b","c"))
a b c
1 1 4 7
2 2 5 8
3 3 6 9
Run Code Online (Sandbox Code Playgroud)
有没有办法对行名称做同样的事情?我认为这会起作用,但它没有:
t(setNames(t(my_df), c("a","b","c")))
Run Code Online (Sandbox Code Playgroud) 假设我创建了一个数据帧(只是为了保持简单):
testframe <- data.frame( a = c(1,2,3,4), b = c(5,6,7,8))
Run Code Online (Sandbox Code Playgroud)
因此,我有两个变量(列)和四个案例(行).
如果我选择一些BEGINNING WITH FIRST行的行,我会得到某种数据帧的子集,例如:
testframe2 <- testframe[1:2,] #selecting the first two rows
Run Code Online (Sandbox Code Playgroud)
但是,如果我对第一行不开始的行做同样的事情,我会得到另一列包含原始数据帧的行号.
testframe3 <- testframe[3:4,] #selecting the last two rows
Run Code Online (Sandbox Code Playgroud)
导致:
a b
3 3 7
4 4 8
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能首先阻止新的row.names变量?我知道我之后可以删除它但也许从一开始就可以避免它.
谢谢你的帮助!
我刚刚收到一个数据文件,其扩展名为“*.psv”。经过一番研究,我不知道如何打开它R。
我正在寻找一种方法来操作R中的data.table中的多个列.由于我必须动态地处理列以及第二个输入,所以我无法找到答案.
这个想法是通过将所有值除以日期值来索引某个日期的两个或更多系列,例如:
set.seed(132)
# simulate some data
dt <- data.table(date = seq(from = as.Date("2000-01-01"), by = "days", length.out = 10),
X1 = cumsum(rnorm(10)),
X2 = cumsum(rnorm(10)))
# set a date for the index
indexDate <- as.Date("2000-01-05")
# get the column names to be able to select the columns dynamically
cols <- colnames(dt)
cols <- cols[substr(cols, 1, 1) == "X"]
Run Code Online (Sandbox Code Playgroud)
第1部分:Easy data.frame/apply方法
df <- as.data.frame(dt)
# get the right rownumber for the indexDate
rownum <- max((1:nrow(df))*(df$date==indexDate))
# use apply to iterate …Run Code Online (Sandbox Code Playgroud) 我对自己非常熟悉data.table,但在setkeyv功能上遇到了一个我无法解决的奇怪错误.
错误非常简单:
keycols<-c("A", "B")
DT <- data.table(A=1:10, B=91:90)
setkeyv(DT, keycols)
# Error in setkeyv(x, cols, verbose = verbose, physical = physical) :
# 4 arguments passed to .Internal(nchar) which requires 3
Run Code Online (Sandbox Code Playgroud)
作为参考,这是我的sessionInfo():
R version 3.2.0 (2015-04-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached …Run Code Online (Sandbox Code Playgroud) 我想通过dplyr :: mutate_each对所有列应用转换,例如
library(dplyr)
mult <- function(x,m) return(x*m)
mtcars %>% mutate_each(funs(mult(.,2))) # Multiply all columns by a factor of two
Run Code Online (Sandbox Code Playgroud)
但是,转换应具有取决于列名称的参数.因此,列名应作为附加参数传递给函数
named.mult <- function(x,colname) return(x*param.A[[colname]])
Run Code Online (Sandbox Code Playgroud)
示例:将每列乘以不同的因子:
param.A <- c()
param.A[names(mtcars)] <- seq(length(names(mtcars)))
param.A
# mpg cyl disp hp drat wt qsec vs am gear carb
# 1 2 3 4 5 6 7 8 9 10 11
Run Code Online (Sandbox Code Playgroud)
由于在mutate_each期间列名丢失,我目前通过将具有延迟评估的列表传递给mutate_(SE版本)来解决此问题:
library(lazyeval)
named.mutate <- function(fun, cols) sapply(cols, function(n) interp(~fun(col, n), fun=fun, col=as.name(n)))
mtcars %>% mutate_(.dots=named.mutate(named.mult, names(.)))
Run Code Online (Sandbox Code Playgroud)
Works,但是有一些特殊的变量,如 …
简短的例子.我正在通过测试不同的"规格"来探索函数的行为f(spec).我手工写下了一个规格spec1,并且正在创建新的规格作为变体.为此,我决定编写一个函数:
spec1 = list(fy = list(a = 1), fx = list(f1 = function(x) 10-x, f2 = function(x) 2-x))
make_spec = function(f = function(x) 10-x, xtheta = 2)
list(fy = list(a = 1), fx = list(f1 = f, f2 = function(x) xtheta-x))
res1 = make_spec()
# first problem: they don't match
all.equal(res1,spec1)
# [1] "Component “fx”: Component “f2”: target, current do not match when deparsed"
# ^ this happens, even though...
res1$fx$f2(4) == spec1$fx$f2(4)
# TRUE …Run Code Online (Sandbox Code Playgroud) 我的R代码:
((x[1]-xm)^2)+((x[2]-xm)^2)+((x[3]-xm)^2)+((x[4]-xm)^2)+((x[5]-xm)^2)+((x[6]-xm)^2)
Run Code Online (Sandbox Code Playgroud)
如果我将问题表述为求和,则这种计算会更容易.我怎么在r?就像是:
sum((x[i]-xm)^2) for i=1 to i=6?
Run Code Online (Sandbox Code Playgroud)
x是数据帧.
我有一个巨大的.csv文件,具体来说是一个.TAB有 2900 万行的文件,文件大小约为 600 MB。我需要把它读到一个IEnumerable集合中。
我已经尝试过CsvHelper,GenericParser和其他一些解决方案,但总是以内存不足异常告终
请建议一种方法来做到这一点
我试过了
var deliveryPoints = new List<Point>();
using (TextReader csvreader1 = File.OpenText(@"C:\testfile\Prod\PCDP1705.TAB")) //StreamReader csvreader1 = new StreamReader(@"C:\testfile\Prod\PCDP1705.TAB"))
using (var csvR1 = new CsvReader(csvreader1, csvconfig))
{
csvR1.Configuration.RegisterClassMap<DeliveryMap>();
deliveryPoints = csvR1.GetRecords<Point>().ToList();
}
using (GenericParser parser = new GenericParser())
{
parser.SetDataSource(@"C:\testfile\Prod\PCDP1705.TAB");
parser.ColumnDelimiter = '\t';
parser.FirstRowHasHeader = false;
//parser.SkipStartingDataRows = 10;
//parser.MaxBufferSize = 4096;
//parser.MaxRows = 500;
parser.TextQualifier = '\"';
while (parser.Read())
{
var address = new Point(); …Run Code Online (Sandbox Code Playgroud) 假设我有这个数据框,它有两个 ID (1/2),它们的开始和结束时间在三个不同的区域 (A/B/C):
df <- structure(list(id = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2), zone = c("A",
"B", "A", "C", "B", "A", "B", "A", "B", "C"), start = c(0, 6,
7, 8, 10, 0, 3, 5, 6, 7), end = c(6, 7, 8, 10, 11, 3, 5, 6, 7,
11)), row.names = c(NA, -10L), class = "data.frame")
df
id zone start end
1 1 A 0 6
2 1 B 6 7
3 1 A 7 …Run Code Online (Sandbox Code Playgroud) r ×9
data.table ×3
dataframe ×3
csv ×2
.net ×1
c# ×1
dplyr ×1
file-format ×1
file-io ×1
pipe ×1
row ×1
streamreader ×1