在使用plyrI 时,我经常发现使用adply标量函数很有用,我必须将其应用于每一行.
例如
data(iris)
library(plyr)
head(
adply(iris, 1, transform , Max.Len= max(Sepal.Length,Petal.Length))
)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Max.Len
1 5.1 3.5 1.4 0.2 setosa 5.1
2 4.9 3.0 1.4 0.2 setosa 4.9
3 4.7 3.2 1.3 0.2 setosa 4.7
4 4.6 3.1 1.5 0.2 setosa 4.6
5 5.0 3.6 1.4 0.2 setosa 5.0
6 5.4 3.9 1.7 0.4 setosa 5.4
Run Code Online (Sandbox Code Playgroud)
现在我正在使用dplyr更多,我想知道是否有一个整洁/自然的方式来做到这一点?因为这不是我想要的:
library(dplyr)
head(
mutate(iris, Max.Len= max(Sepal.Length,Petal.Length))
)
Sepal.Length Sepal.Width Petal.Length Petal.Width …Run Code Online (Sandbox Code Playgroud) 我正在使用data.table,并且有许多功能需要我设置密钥(例如X[Y]).因此,我希望了解密钥在我的数据表中正确设置密钥的作用.
我读过的一个来源是?setkey.
setkey()对adata.table进行排序并将其标记为已排序.排序列是关键.密钥可以是任何顺序的任何列.列始终按升序排序.该表通过引用更改.除了临时工作内存大到一列之外,根本不会复制.
我的理念是,一个键可以"排序"data.table,从而产生非常相似的效果order().但是,它没有解释拥有密钥的目的.
data.table FAQ 3.2和3.3解释了:
3.2我没有大桌子上的钥匙,但分组仍然非常快.这是为什么?
data.table使用基数排序.这比其他排序算法快得多.Radix仅用于整数,请参阅
?base::sort.list(x,method="radix").这也是setkey()快速的原因之一 .如果没有设置密钥,或者我们按照与密钥不同的顺序进行分组,我们称之为ad hoc.3.3为什么密钥中的列按比ad hoc更快的分组?
因为每个组在RAM中是连续的,从而最小化页面提取,并且可以批量复制内存(
memcpy在C中)而不是在C中循环.
从这里开始,我想设置一个键以某种方式允许R使用"基数排序"而不是其他算法,这就是它更快的原因.
10分钟快速入门指南还有一个按键指南.
- 按键
让我们从考虑data.frame,特别是rownames(或英文,行名)开始.也就是说,属于单行的多个名称.属于单行的多个名称?这不是我们在data.frame中习惯的.我们知道每行最多只有一个名称.一个人至少有两个名字,第一个名字和第二个名字.这对于组织电话目录很有用,例如,按姓氏排序,然后是第一个名称.但是,data.frame中的每一行只能有一个名称.
密钥由一列或多列rownames组成,可以是整数,因子,字符或其他类,而不仅仅是字符.此外,行按键排序.因此,data.table最多只能有一个键,因为它不能以多种方式排序.
不强制执行唯一性,即允许重复键值.由于行按键排序,因此键中的任何重复项都将连续出现
电话簿有助于理解密钥是什么,但与具有因子列相比,似乎密钥没有区别.此外,它没有解释为什么需要密钥(特别是使用某些功能)以及如何选择要设置为密钥的列.此外,似乎在data.table中将time作为列,将任何其他列设置为键也可能会使时间列混乱,这使得它更加混乱,因为我不知道是否允许将任何其他列设置为键.有人可以开导我吗?
我有两个数据帧,我想使用dplyr加入.一个是包含名字的数据框.
test_data <- data.frame(first_name = c("john", "bill", "madison", "abby", "zzz"),
stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)
另一个数据框包含Kantrowitz名称语料库的清理版本,用于识别性别.这是一个最小的例子:
kantrowitz <- structure(list(name = c("john", "bill", "madison", "abby", "thomas"), gender = c("M", "either", "M", "either", "M")), .Names = c("name", "gender"), row.names = c(NA, 5L), class = c("tbl_df", "tbl", "data.frame"))
Run Code Online (Sandbox Code Playgroud)
我基本上想要test_data使用kantrowitz表格从表中查找名称的性别.因为我要将它抽象为一个函数encode_gender,所以我不知道将要使用的数据集中列的名称,因此我不能保证它将会被name用作,例如kantrowitz$name.
在基础RI中将以这种方式执行合并:
merge(test_data, kantrowitz, by.x = "first_names", by.y = "name", all.x = TRUE)
Run Code Online (Sandbox Code Playgroud)
返回正确的输出:
first_name gender
1 abby either
2 bill either
3 john M
4 madison …Run Code Online (Sandbox Code Playgroud) 我将数据保存为.csv12列的文件.第2至11列(标记为F1, F2, ..., F11)features.Column one包含或label这些功能.goodbad
我想绘制boxplot的所有这些功能11对label,而是通过单独good或bad.到目前为止我的代码是:
qplot(Label, F1, data=testData, geom = "boxplot", fill=Label,
binwidth=0.5, main="Test") + xlab("Label") + ylab("Features")
Run Code Online (Sandbox Code Playgroud)
然而,这只能说明F1反对label.
我的问题是:如何显示F2, F3, ..., F11对label在一个图表一些dodge position?我已将这些特征标准化,因此它们在[0 1]范围内具有相同的比例.
测试数据可以在这里找到.我手工绘制了一些东西来解释这个问题(见下文).

给出一个示例数据框:
C1<-c(3,2,4,4,5)
C2<-c(3,7,3,4,5)
C3<-c(5,4,3,6,3)
DF<-data.frame(ID=c("A","B","C","D","E"),C1=C1,C2=C2,C3=C3)
DF
ID C1 C2 C3
1 A 3 3 5
2 B 2 7 4
3 C 4 3 3
4 D 4 4 6
5 E 5 5 3
Run Code Online (Sandbox Code Playgroud)
创建包含ID列和每行平均值的第二个数据框的最佳方法是什么?像这样的东西:
ID Mean
A 3.66
B 4.33
C 3.33
D 4.66
E 4.33
Run Code Online (Sandbox Code Playgroud)
类似的东西:
RM<-rowMeans(DF[,2:4])
Run Code Online (Sandbox Code Playgroud)
我想保持手段与他们ID的一致.
我正在研究一个非检测数据框,用'<'编码.有时在'<'之后有一个空格,有时不是例如'<2'或'<2'.我想删除每一个空间.
例:
data <- data.frame(name = rep(letters[1:3], each = 3), var1 = rep('< 2', 9), var2 = rep('<3', 9))
name var1 var2
1 a < 2 <3
2 b < 2 <3
3 c < 2 <3
Run Code Online (Sandbox Code Playgroud)
这是我必须要做的:
我可以提取所有值并创建新字符串,但我不能将它们放回数据框中.
index <- str_detect(unlist(data), '<')
index <- matrix(index, nrow = 3)
data[index]
#[1] "< 2" "< 2" "< 2" "<3" "<3" "<3"
replacements <- str_replace_all(data[index], "<[ ]+","<")
replacements
#[1] "<2" "<2" "<2" "<3" "<3" "<3"
data[index] <- replacements
#Error in `[<-.data.frame`(`*tmp*`, index, …Run Code Online (Sandbox Code Playgroud) 在使用R之前,我使用了相当多的Perl.在Perl中,我经常使用哈希,并且在Perl中通常认为哈希的查找速度很快.
例如,以下代码将填充最多10000个键/值对的散列,其中键是随机字母,值是随机整数.然后,它在该哈希中进行10000次随机查找.
#!/usr/bin/perl -w
use strict;
my @letters = ('a'..'z');
print @letters . "\n";
my %testHash;
for(my $i = 0; $i < 10000; $i++) {
my $r1 = int(rand(26));
my $r2 = int(rand(26));
my $r3 = int(rand(26));
my $key = $letters[$r1] . $letters[$r2] . $letters[$r3];
my $value = int(rand(1000));
$testHash{$key} = $value;
}
my @keyArray = keys(%testHash);
my $keyLen = scalar @keyArray;
for(my $j = 0; $j < 10000; $j++) {
my $key = $keyArray[int(rand($keyLen))];
my $lookupValue = $testHash{$key};
print …Run Code Online (Sandbox Code Playgroud) 我想根据两列中的值将大型数据帧拆分为数据帧列表.然后,我想在结果列表中对所有数据帧(滞后变换)应用公共数据转换.我知道split命令但只能让它一次处理一列数据.
我有几个不同的txt文件具有相同的结构.现在我想用fread将它们读入R,然后将它们组合成一个更大的数据集.
## First put all file names into a list
library(data.table)
all.files <- list.files(path = "C:/Users",pattern = ".txt")
## Read data using fread
readdata <- function(fn){
dt_temp <- fread(fn, sep=",")
keycols <- c("ID", "date")
setkeyv(dt_temp,keycols) # Notice there's a "v" after setkey with multiple keys
return(dt_temp)
}
# then using
mylist <- lapply(all.files, readdata)
mydata <- do.call('rbind',mylist)
Run Code Online (Sandbox Code Playgroud)
代码工作正常,但速度不理想.每个txt文件有1M个观察值和12个字段.
如果我用它fread来读取单个文件,那就快了.但是使用apply,那么速度非常慢,显然比逐个读取文件需要花费很多时间.我想知道这里出了什么问题,速度提升有什么改进吗?
我试图llply在plyr包中,有是没有太大的速度上涨.
此外,是否有任何语法data.table实现垂直连接喜欢rbind和unionin sql?
谢谢.
任何人都可以解释如何将a中的单个单元格更改为其他单元格data.frame.基本上我只想重命名一个单元格,而不是所有匹配它的单元格.我无法使用该edit()命令,因为它会搞砸我的脚本,因为我data.frame多次使用它.
提前致谢