小编tal*_*lat的帖子

dplyr中的mutate_each/summarise_each:如何选择某些列并为变异列赋予新名称?

我对dplyr动词有点困惑mutate_each.

使用basic mutate将数据列转换为z-scores,并在data.frame中创建一个新列(此处带有名称z_score_data)非常简单:

newDF <- DF %>%
  select(one_column) %>%
  mutate(z_score_data = one_column - (mean(one_column) / sd(one_column))
Run Code Online (Sandbox Code Playgroud)

但是,由于我想要转换许多数据列,看起来我应该使用mutate_each动词.

newDF <- DF %>%
     mutate_each(funs(scale))
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但到目前为止我还没弄清楚:

  1. 我怎样才能为这些新列提供适当的名称,就像我可以使用的那样mutate
  2. 如何选择我希望变异的某些列,就像我select在第一种情况下所做的那样?

谢谢你的帮助.

r dataframe dplyr

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

将R中的特定其他列与data.table相乘多列?

我在R中有一个大的data.table,其中有几列带有美元值.在另一栏中,我有一个通胀调整数字.我试图找出如何用它乘以通胀调整列来更新我的每个货币列.假设我有数据:

   DT <- data.table(id=1:1000,year=round(runif(1000)*10), 
          inc1 = runif(1000), inc2 = runif(1000), inc3 = runif(1000),    
          deflator = rnorm(1000))
Run Code Online (Sandbox Code Playgroud)

给出输出:

             id year      inc1      inc2       inc3    deflator
   1:    1    8 0.4754808 0.6678110 0.41533976 -0.64126988
   2:    2    2 0.6568746 0.7765634 0.70616373  0.39687915
   3:    3    6 0.8192947 0.9236281 0.90002534 -0.69545700
   4:    4    4 0.7781929 0.1624902 0.17565790  0.05263055
   5:    5    7 0.6232520 0.8024975 0.86449836  0.70781887
  ---                                                     
 996:  996    2 0.9676383 0.2238746 0.19822000  0.78564836
 997:  997    9 0.9877410 0.5783748 0.57497438 -1.63365223
 998:  998    8 0.2220570 0.6500632 0.19814932  1.00260174 …
Run Code Online (Sandbox Code Playgroud)

r data.table

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

dplyr :: group_by_,带有几个变量名的字符串输入

我正在编写一个函数,要求用户在函数调用中定义一个或多个分组变量.然后使用dplyr对数据进行分组,如果只有一个分组变量,它会按预期工作,但我还没有想出如何使用多个分组变量.

例:

x <- c("cyl")
y <- c("cyl", "gear")
dots <- list(~cyl, ~gear)

library(dplyr)
library(lazyeval) 

mtcars %>% group_by_(x)             # groups by cyl
mtcars %>% group_by_(y)             # groups only by cyl (not gear)
mtcars %>% group_by_(.dots = dots)  # groups by cyl and gear, this is what I want.
Run Code Online (Sandbox Code Playgroud)

我试着变成ydots使用相同:

mtcars %>% group_by_(.dots = interp(~var, var = list(y)))
#Error: is.call(expr) || is.name(expr) || is.atomic(expr) is not TRUE
Run Code Online (Sandbox Code Playgroud)

如何使用> 1个变量名的用户定义输入字符串(如y示例中所示)使用dplyr对数据进行分组?

(这个问题在某种程度上与这个有关,但在那里没有回答.)

r dplyr

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

将dplyr summarise_at与列索引一起使用

我注意到,在dplyr::summarize_at确定要汇总的列的列索引时,不包括分组列.我想知道这是否应该如此,因为通过这种设计,使用正确的列索引取决于汇总列是在分组列之前还是之后定位.

这是一个例子:

library(dplyr)
data("mtcars")

# grouping column after summarise columns
mtcars %>% group_by(gear) %>% summarise_at(3:4, mean)
## A tibble: 3 x 3
#   gear     disp       hp
#  <dbl>    <dbl>    <dbl>
#1     3 326.3000 176.1333
#2     4 123.0167  89.5000
#3     5 202.4800 195.6000

# grouping columns before summarise columns
mtcars %>% group_by(cyl) %>% summarise_at(3:4, mean)
## A tibble: 3 x 3
#    cyl        hp     drat
#  <dbl>     <dbl>    <dbl>
#1     4  82.63636 4.070909
#2     6 122.28571 3.585714
#3     8 …
Run Code Online (Sandbox Code Playgroud)

r dplyr

23
推荐指数
1
解决办法
5045
查看次数

子集观察至少相差30分钟

我有一个data.table(约3000万行)由一datetimePOSIXct格式,一id列和一些其他列组成(在这个例子中,我只留下一个不相关的列x来证明存在其他需要保留的列).A dput位于帖子的底部.

head(DT)
#              datetime          x id
#1: 2016-04-28 16:20:18 0.02461368  1
#2: 2016-04-28 16:41:34 0.88953932  1
#3: 2016-04-28 16:46:07 0.31818101  1
#4: 2016-04-28 17:00:56 0.14711365  1
#5: 2016-04-28 17:09:11 0.54406602  1
#6: 2016-04-28 17:39:09 0.69280341  1
Run Code Online (Sandbox Code Playgroud)

问:对于每一个id,我需要仅对那些相差超过30分钟的观察进行子集化.什么是有效的data.table方法来做到这一点(如果可能的话,没有广泛的循环)?

逻辑也可以描述为(如下面的评论):

每个id始终保留第一行.在第一行之后至少30分钟的下一行也应保留.让我们假设要保留的行是第4行.然后,计算第4行和第5行之间的时间差:n并保持第一个相差超过30分钟,依此类推

在下面的dput中,我添加了一个列,keep用于指示在此示例中应保留哪些行,因为它们与每个id保留的上一个观察值相差超过30分钟.困难在于似乎有必要迭代地计算时间差(或者至少,我现在想不到更有效的方法).

library(data.table)
DT <- structure(list(
  datetime = structure(c(1461853218.81561, 1461854494.81561, 
    1461854767.81561, 1461855656.81561, 1461856151.81561, 1461857949.81561, 
    1461858601.81561, 1461858706.81561, 1461859078.81561, 1461859103.81561, 
    1461852799.81561, 1461852824.81561, 1461854204.81561, 1461855331.81561, 
    1461855633.81561, 1461856311.81561, …
Run Code Online (Sandbox Code Playgroud)

r posixct data.table

16
推荐指数
3
解决办法
318
查看次数

使用dplyr向分组数据添加行?

我的数据采用data.frame格式,如此示例数据:

data <- 
structure(list(Article = structure(c(1L, 1L, 3L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L
), .Label = c("10004", "10006", "10007"), class = "factor"), 
Demand = c(26L, 780L, 2L, 181L, 228L, 214L, 219L, 291L, 104L, 
72L, 155L, 237L, 182L, 148L, 52L, 227L, 2L, 355L, 2L, 432L, 
1L, 156L), Week = c("2013-W01", "2013-W01", "2013-W01", "2013-W01", 
"2013-W01", "2013-W02", "2013-W02", "2013-W02", "2013-W02", 
"2013-W02", "2013-W03", "2013-W03", "2013-W03", "2013-W03", 
"2013-W03", "2013-W04", "2013-W04", "2013-W04", …
Run Code Online (Sandbox Code Playgroud)

r dataframe dplyr

15
推荐指数
2
解决办法
8114
查看次数

替换多个(3+)大写字母之间的空格

我有一些文字,其中人们使用大写,其间有空格,以使子串突出.我想替换这些子串之间的空格.该模式的规则是:"至少3个连续的大写字母,每个字母之间有一个空格".

我很好奇如何使用纯正则表达式以及gsubfn包这样做,因为我认为这对它来说是一件容易的工作但是在下面的MWE示例中我因为额外的字母放在那里而崩溃和烧毁(我很好奇为什么会发生这种情况).

MWE

x <- c(
    'Welcome to A I: the best W O R L D!',
    'Hi I R is the B O M B for sure: we A G R E E indeed.'
)

## first to show I have the right regex pattern
gsub('(([A-Z]\\s+){2,}[A-Z])', '<FOO>', x)
## [1] "Welcome to A I: the best <FOO>!"               
## [2] "Hi I R is the <FOO> for sure: we <FOO> indeed."

library(gsubfn)
spacrm1 <- function(string) {gsub('\\s+', …
Run Code Online (Sandbox Code Playgroud)

regex r gsubfn

15
推荐指数
3
解决办法
640
查看次数

从列表中获取长格式数据框

我有一个包含字符串的列表列表.每个子列表的第一个字符串描述了以下字符串所属的类别.我想得到一个(长格式)数据框,其中一列用于类别,一列用于内容.如何从此列表中获取长格式的数据框:

mylist <- list(
  c("A","lorem","ipsum"),
  c("B","sed", "eiusmod", "tempor" ,"inci"),
  c("C","aliq", "ex", "ea"))

> mylist
[[1]]
[1] "A"     "lorem" "ipsum"

[[2]]
[1] "B"        "sed"      "eiusmod"  "tempor"   "incidunt"

[[3]]
[1] "C"       "aliquid" "ex"      "ea" 
Run Code Online (Sandbox Code Playgroud)

它应该看起来像这个数据框架

mydf <- data.frame(cate= c("A","A","B","B","B","B","C","C","C"),
               cont= c("lorem","ipsum","sed", "eiusmod", "tempor","inci","aliq", "ex", "ea"))

> mydf
  cate    cont
1   A    lorem
2   A    ipsum
3   B      sed
4   B  eiusmod
5   B   tempor
6   B incidunt
7   C  aliquid
8   C       ex
9   C       ea
Run Code Online (Sandbox Code Playgroud)

我已经分开了类别和内容.

cate <- sapply(mylist, "[[",1)
cont …
Run Code Online (Sandbox Code Playgroud)

r list dataframe

14
推荐指数
3
解决办法
1076
查看次数

计算每个id长度为2的组合

我有data.table两个栏目,id并且var:

head(DT)
#    id var
# 1:  1   B
# 2:  1   C
# 3:  1   A
# 4:  1   C
# 5:  2   B
# 6:  2   C
Run Code Online (Sandbox Code Playgroud)

我想创建一种交叉表,显示数据中出现的不同长度2组合的次数var.

样本数据的预期输出:

out
#    A  B C
# A  0  3 3
# B NA  1 3
# C NA NA 0
Run Code Online (Sandbox Code Playgroud)

说明:

  • 结果矩阵的对角线/ data.frame/data.table计算所有vars发生的对数的id全部相同(全部A,或B,或C).在示例数据中,id4只有一个条目B,因此B- …

r data.table

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

从R中的数据框中获取具有多个单独观察的组级观察计数

我如何得到这样的数据帧:

soccer_player country position
"sam"         USA     left defender
"jon"         USA     right defender
"sam"         USA     left midfielder
"jon"         USA     offender
"bob"         England goalie
"julie"       England central midfielder
"jane"        England goalie
Run Code Online (Sandbox Code Playgroud)

看起来像这样(每个国家/地区拥有独特玩家数量的国家/地区):

country player_count
USA     2
England 3
Run Code Online (Sandbox Code Playgroud)

显而易见的复杂因素是每个玩家有多个观察,所以我不能简单table(df$country)地获得每个国家的观察数量.

我一直在玩table()merge()功能,但没有运气.

r dataframe

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

标签 统计

r ×10

dataframe ×4

dplyr ×4

data.table ×3

gsubfn ×1

list ×1

posixct ×1

regex ×1