小编Aru*_*run的帖子

使用dplyr将函数应用于表的每一行?

在使用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)

r plyr dplyr

111
推荐指数
5
解决办法
7万
查看次数

在data.table中设置密钥的目的是什么?

我正在使用data.table,并且有许多功能需要我设置密钥(例如X[Y]).因此,我希望了解密钥在我的数据表中正确设置密钥的作用.


我读过的一个来源是?setkey.

setkey()对a data.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分钟快速入门指南还有一个按键指南.

  1. 按键

让我们从考虑data.frame,特别是rownames(或英文,行名)开始.也就是说,属于单行的多个名称.属于单行的多个名称?这不是我们在data.frame中习惯的.我们知道每行最多只有一个名称.一个人至少有两个名字,第一个名字和第二个名字.这对于组织电话目录很有用,例如,按姓氏排序,然后是第一个名称.但是,data.frame中的每一行只能有一个名称.

密钥由一列或多列rownames组成,可以是整数,因子,字符或其他类,而不仅仅是字符.此外,行按键排序.因此,data.table最多只能有一个键,因为它不能以多种方式排序.

不强制执行唯一性,即允许重复键值.由于行按键排序,因此键中的任何重复项都将连续出现

电话簿有助于理解密钥是什么,但与具有因子列相比,似乎密钥没有区别.此外,它没有解释为什么需要密钥(特别是使用某些功能)以及如何选择要设置为密钥的列.此外,似乎在data.table中将time作为列,将任何其他列设置为键也可能会使时间列混乱,这使得它更加混乱,因为我不知道是否允许将任何其他列设置为键.有人可以开导我吗?

r data.table

107
推荐指数
2
解决办法
4万
查看次数

在dplyr中加入时,如何为x和y指定列的名称?

我有两个数据帧,我想使用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)

join r left-join dplyr

74
推荐指数
2
解决办法
9万
查看次数

在一个图中绘制多个箱图

我将数据保存为.csv12列的文件.第2至11列(标记为F1, F2, ..., F11)features.Column one包含或label这些功能.goodbad

我想绘制boxplot所有这些功能11label,而是通过单独goodbad.到目前为止我的代码是:

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, ..., F11label在一个图表一些dodge position?我已将这些特征标准化,因此它们在[0 1]范围内具有相同的比例.

测试数据可以在这里找到.我手工绘制了一些东西来解释这个问题(见下文).

手绘boxplot示例

plot r ggplot2 boxplot

67
推荐指数
6
解决办法
25万
查看次数

计算列子集上的行均值

给出一个示例数据框:

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的一致.

r dataframe

48
推荐指数
4
解决办法
13万
查看次数

替换数据框中出现的所有字符串

我正在研究一个非检测数据框,用'<'编码.有时在'<'之后有一个空格,有时不是例如'<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 dataframe

48
推荐指数
6
解决办法
9万
查看次数

我可以在R中使用列表作为哈希吗?如果是这样,为什么这么慢?

在使用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)

perl hash r

39
推荐指数
5
解决办法
1万
查看次数

使用两列数据拆分数据框,并对结果数据框列表应用常见转换

我想根据两列中的值将大型数据帧拆分为数据帧列表.然后,我想在结果列表中对所有数据帧(滞后变换)应用公共数据转换.我知道split命令但只能让它一次处理一列数据.

split r dataframe

33
推荐指数
2
解决办法
2万
查看次数

使用data.table快速读取和组合多个文件(带有fread)

我有几个不同的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,那么速度非常慢,显然比逐个读取文件需要花费很多时间.我想知道这里出了什么问题,速度提升有什么改进吗?

我试图llplyplyr包中,有是没有太大的速度上涨.

此外,是否有任何语法data.table实现垂直连接喜欢rbindunionin sql

谢谢.

r fread data.table

31
推荐指数
1
解决办法
1万
查看次数

如何更改data.frame中的单个值?

任何人都可以解释如何将a中的单个单元格更改为其他单元格data.frame.基本上我只想重命名一个单元格,而不是所有匹配它的单元格.我无法使用该edit()命令,因为它会搞砸我的脚本,因为我data.frame多次使用它.

提前致谢

r cell dataframe

29
推荐指数
4
解决办法
8万
查看次数

标签 统计

r ×10

dataframe ×4

data.table ×2

dplyr ×2

boxplot ×1

cell ×1

fread ×1

ggplot2 ×1

hash ×1

join ×1

left-join ×1

perl ×1

plot ×1

plyr ×1

split ×1