小编Gab*_*yLP的帖子

以可读的方式获得不同的dplyr计数

我是新用的dplyr,我需要计算一组中的不同值.这是一个表格示例:

data=data.frame(aa=c(1,2,3,4,NA), bb=c('a', 'b', 'a', 'c', 'c'))
Run Code Online (Sandbox Code Playgroud)

我知道我可以这样做:

by_bb<-group_by(data, bb, add = TRUE)
summarise(by_bb, mean(aa, na.rm=TRUE), max(aa), sum(!is.na(aa)), length(aa))
Run Code Online (Sandbox Code Playgroud)

但如果我想要独特元素的数量?

我可以:

  > summarise(by_bb,length(unique(unlist(aa))))

  bb length(unique(unlist(aa)))
1  a                          2
2  b                          1
3  c                          2
Run Code Online (Sandbox Code Playgroud)

如果我想排除NAs,我会做:

> summarise(by_bb,length(unique(unlist(aa[!is.na(aa)]))))

  bb length(unique(unlist(aa[!is.na(aa)])))
1  a                                      2
2  b                                      1
3  c                                      1
Run Code Online (Sandbox Code Playgroud)

但这对我来说有点难以理解.有没有更好的方法来进行这种摘要?

idioms r summarization dplyr

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

R-将列的列转换为不同的列,使用它们的值作为名称(虚拟)

我有一个包含电影数据的表格,在最后一列中,它有电影所属的类别.

  movieId                              title                   category
       1                   Toy Story (1995)  Animation|Children|Comedy
       2                     Jumanji (1995) Adventure|Children|Fantasy
       3            Grumpier Old Men (1995)             Comedy|Romance
       4           Waiting to Exhale (1995)               Comedy|Drama
       5 Father of the Bride Part II (1995)                     Comedy
       6                        Heat (1995)      Action|Crime|Thriller
Run Code Online (Sandbox Code Playgroud)

我想为每个类别创建一个列,如果它写在该电影的列表中则放1,否则放0.就像是:

movieId title   animation   comedy  drama
1        xx        1           0      1
2        xy        1           0      0
3        yy        1           1      0
Run Code Online (Sandbox Code Playgroud)

到目前为止,我只将字符串转换为列表:

f<-function(x) {strsplit(x, split='|', fixed=TRUE)}
movies2$m<-lapply(movies2$category, f)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何做其余的事情.

我在考虑使用Python词典.但我不知道如何在R中这样做.

数据

df1 <- read.table(header = TRUE, stringsAsFactors = FALSE,
                  text = " …
Run Code Online (Sandbox Code Playgroud)

split r dataframe

12
推荐指数
1
解决办法
215
查看次数

使用R中的任何NA查看所有列名称

我需要获取至少有1个NA的列的名称.

df<-data.frame(a=1:3,b=c(NA,8,6), c=c('t',NA,7))
Run Code Online (Sandbox Code Playgroud)

我需要得到"b,c".

我找到了这段代码:

sapply(df, function(x) any(is.na(x)))
Run Code Online (Sandbox Code Playgroud)

但我只需要有任何NA的变量.

我试过这个:

sapply(df, function(x) colnames(df[,any(is.na(x))]))
Run Code Online (Sandbox Code Playgroud)

但我得到了所有的列名.

r sapply

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

图像中的r轴标签

我需要根据呼叫中心的空间位置绘制度量标准.我用R写了一个小例子:

tt<-data.frame(a1=c(0.4,.5,.5,.7),a2=c(.5,.6,.7,.8), a3=c(.8,.7,.9,.8))
row.names(tt)<-paste("L", 1:4, sep='')
tt<-as.matrix(tt)
tt
Run Code Online (Sandbox Code Playgroud)

所以我的矩阵是:

> tt
    a1  a2  a3
L1 0.4 0.5 0.8
L2 0.5 0.6 0.7
L3 0.5 0.7 0.9
L4 0.7 0.8 0.8
Run Code Online (Sandbox Code Playgroud)

我试过了:

palette <- colorRampPalette(c('#f0f3ff','#0033BB'))(256)
library(fields)
image.plot(t(tt[rev(order(row.names(tt))),]),col = palette, axes=F ,
       lab.breaks=NULL)
Run Code Online (Sandbox Code Playgroud)

我不得不对矩阵进行转置和重新排序,因为我想要你在表格中阅读它的方式.

所以我得到了:

在此输入图像描述

我需要在每个方块旁边添加行名和列名.例如,左上角的平方应在左侧为"L1",在顶部为"a1".

另外我想在每个方块中添加值.

我尝试过axis()但是得到了错误的结果.我在R中做图表很新,所以任何帮助都会受到赞赏.

label axis r image

7
推荐指数
2
解决办法
3936
查看次数

找到R中3列中每行的最大值

我需要计算3列中每行的最大值.

表可以是:

x = c(1,2,3,4,5 ) 
y = c(2,3,3,1,1 ) 
z = c(4,3,2,1,1 ) 
df<-data.frame(x,y,z)
Run Code Online (Sandbox Code Playgroud)

我需要得到:

    x   y   z   max
1   1   2   4   4
2   2   3   3   3
3   3   3   2   3
4   4   1   1   4
5   5   1   1   5
Run Code Online (Sandbox Code Playgroud)

我试过了:

df$max<-max(x, y,z)
Run Code Online (Sandbox Code Playgroud)

但我得到:

  x y z max
1 1 2 4   5
2 2 3 3   5
3 3 3 2   5
4 4 1 1   5
5 5 1 1   5
Run Code Online (Sandbox Code Playgroud)

那么,我该怎么做呢?

r max

6
推荐指数
3
解决办法
8102
查看次数

R-删除字符串中的重音符号

我有一个带有html文件的库,在files_dep中我有它们的列表.我需要将存储在其中的文本转换为表格,但问题是它们有重音和ñ.我写这篇文章阅读它并且工作正常.

for (i in files_dep) {
  text<-readLines(i,encoding="UTF-8")
  aa<-paste(text, collapse=' ')
  if (grepl(empieza,aa) & grepl(termina,aa)) {
    nota=gsub(paste0("(^.*", empieza, ")(.*?)(", termina, ".*)$"), "\\2", aa)
    #nota<-iconv(nota,to="ASCII//TRANSLIT")
    df<-rbind(df, data.frame(fileName=i, nota=nota)) }}  
Run Code Online (Sandbox Code Playgroud)

我可以阅读以下内容:

Este sábado enfrentarán a un equipo.
Run Code Online (Sandbox Code Playgroud)

所以我只需要删除重音符号.我试着取消注释

nota <- iconv(nota,to="ASCII//TRANSLIT")
Run Code Online (Sandbox Code Playgroud)

但我得到:

 Este sA!bado se enfrentarA!n a un equipo. 
Run Code Online (Sandbox Code Playgroud)

所以,我不知道问题是什么.

另外,我需要删除重音和所有特殊字符.谢谢

版:

我在循环结束时将最后一个数据存储在nota中.这就是我所看到的:

nota
[1] "                         <p>La inclusión del seleccionado argentino en el viejo Tres Naciones significó, hace tres años, la confirmación de que el nivel del rugby argentino estaba a la altura …
Run Code Online (Sandbox Code Playgroud)

encoding r utf-8 character-encoding

6
推荐指数
1
解决办法
5946
查看次数

R-从R数据帧在SQL Server中创建临时表

我知道我可以使用R在SQL中创建一个临时表,例如:

require(RODBC)

X<- odbcDriverConnect('driver={SQL Server};
    server=s001000;database=X1;trusted_connection=true')

sqlQuery(X, "create table #temptable (test int)" )
sqlQuery(X,  "insert into #temptable(test) values(201508)")
doesItWork <- sqlQuery(X, "select * from #temptable")
Run Code Online (Sandbox Code Playgroud)

但是我想从R对象在sql server中创建一个临时表(我有一个具有先前R计算结果的表,我需要针对SQL中的另一个表查询它。我不想将其导出为txt并将其上传到SQL Server。这必须是从R执行此操作的一种方法。

tabla<-data.frame(per=c(201508,201510))
sqlQuery(X, "Select * into ##temporal from tabla")
Run Code Online (Sandbox Code Playgroud)

但是我收到一条错误消息:

“ 42S02 208 [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]无效的对象名称't​​abla'。” “ [[RODBC]错误:无法SQLExecDirect'从tabla中将*选择到## temporal中'”

我也知道我可以用sqlSave创建一个表:

sqlSave(X, tabla, rownames=FALSE,safer=FALSE)
Run Code Online (Sandbox Code Playgroud)

但是我想创建一个临时表。如何从R对象在SQL中创建临时表?

sql sql-server r rodbc

6
推荐指数
1
解决办法
4800
查看次数

R-在函数内赋值

我需要从输入另一个数据框名称并重塑数据的函数中创建一个数据框。当我需要在输入表名称转换后命名输出时,问题就出现了。到目前为止我的代码是:

tablaXYZ<-data.frame(a=seq(1,2,1), 'X1'=seq(2,3,1), 'X2'=seq(3,4,1))
rownames(tablaXYZ)<-c('X1', 'X2')
Run Code Online (Sandbox Code Playgroud)

我写的函数是:

creaMelts<-function(tbl){
    library(reshape2)
    texto<-deparse(substitute(tbl))
    tbl2<-melt(tbl, id.vars=rownames(tbl))
    texto2<-substr(texto,4,nchar(texto))
    colnames(tbl2)<-c('userId','movieId', texto2)
    tblName<<-paste0('df', texto2)
    print(paste('tblName', tblName, ' '))
    assign(tblName, tbl2)
    return(assign(tblName, tbl2))
}
Run Code Online (Sandbox Code Playgroud)

当我运行时:

creaMelts(tablaXYZ)
Run Code Online (Sandbox Code Playgroud)

我得到:

"tblName dflaXYZ  "
Run Code Online (Sandbox Code Playgroud)

因此,考虑到“分配”工作在第二位给出的对象中返回,名称存储在第一位的对象中,例如:

 `m<-'hola'`
 assign(m, tablaXYZ)
Run Code Online (Sandbox Code Playgroud)

然后我要求 m,我得到:

"hola"
Run Code Online (Sandbox Code Playgroud)

但是如果我要求“hola”,我会得到一张桌子:

hola
   a X1 X2
X1 1  2  3
X2 2  3  4
Run Code Online (Sandbox Code Playgroud)

我以为我会有一个名为“dflaXYZ”的数据框,其中包含以下值:

  userId movieId laXYZ NA
1      2       3     a  1
2      3       4     a  2
Run Code Online (Sandbox Code Playgroud)

但如果我跑:

 dflaXYZ
Run Code Online (Sandbox Code Playgroud)

我只得到:

"dflaXYZ"
Run Code Online (Sandbox Code Playgroud)

如果我运行例如:

a<-creaMelts(tablaXYZ)
Run Code Online (Sandbox Code Playgroud)

然后要求“a”,我得到了想要的表。

  userId movieId laXYZ NA
1      2 …
Run Code Online (Sandbox Code Playgroud)

r function assign

6
推荐指数
1
解决办法
4530
查看次数

R -apply-将许多列从数字转换为因子

我需要将许多数字列转换为因子类型.示例表:

df <- data.frame(A=1:10, B=2:11, C=3:12)
Run Code Online (Sandbox Code Playgroud)

我尝试了申请:

cols<-c('A', 'B')
df[,cols]<-apply(df[,cols], 2, function(x){ as.factor(x)});
Run Code Online (Sandbox Code Playgroud)

但结果是一个角色类.

> class(df$A)
[1] "character"
Run Code Online (Sandbox Code Playgroud)

如果不为每列执行as.factor,我该怎么做?

r class apply

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

加速ifelse()而不编写C/C++?

我需要得到以下函数的结果

  getScore <- function(history, similarities) {    
    nh<-ifelse(similarities<0, 6-history,history)
    x <- nh*abs(similarities) 
    contados <- !is.na(history)
    x2 <- sum(x, na.rm=TRUE)/sum(abs(similarities[contados]),na.rm=TRUE)
    x2
    }
Run Code Online (Sandbox Code Playgroud)

例如,对于以下向量:

notes <- c(1:5, NA)
history <- sample(notes, 1000000, replace=T)
similarities <- runif(1000000, -1,1)
Run Code Online (Sandbox Code Playgroud)

这在循环中发生变化.这需要:

ptm <- proc.time()
for (i in (1:10)) getScore(history, similarities)
proc.time() - ptm

   user  system elapsed 
   3.71    1.11    4.67 
Run Code Online (Sandbox Code Playgroud)

最初我怀疑问题是for循环,但分析结果指向ifelse().

Rprof("foo.out")
for (i in (1:10)) getScore(history, similarities)
Rprof(NULL)
summaryRprof("foo.out")

$by.self
           self.time self.pct total.time total.pct
"ifelse"        2.96    65.78       3.48     77.33
"-"             0.24     5.33 …
Run Code Online (Sandbox Code Playgroud)

performance time r vectorization

5
推荐指数
2
解决办法
329
查看次数