我对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)
到现在为止还挺好.但到目前为止我还没弄清楚:
mutate?select在第一种情况下所做的那样?谢谢你的帮助.
我在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) 我正在编写一个函数,要求用户在函数调用中定义一个或多个分组变量.然后使用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)
我试着变成y和dots使用相同:
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对数据进行分组?
(这个问题在某种程度上与这个有关,但在那里没有回答.)
我注意到,在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) 我有一个data.table(约3000万行)由一datetime列POSIXct格式,一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) 我的数据采用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) 我有一些文字,其中人们使用大写,其间有空格,以使子串突出.我想替换这些子串之间的空格.该模式的规则是:"至少3个连续的大写字母,每个字母之间有一个空格".
我很好奇如何使用纯正则表达式以及gsubfn包这样做,因为我认为这对它来说是一件容易的工作但是在下面的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) 我有一个包含字符串的列表列表.每个子列表的第一个字符串描述了以下字符串所属的类别.我想得到一个(长格式)数据框,其中一列用于类别,一列用于内容.如何从此列表中获取长格式的数据框:
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) 我有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)
说明:
vars发生的对数的id全部相同(全部A,或B,或C).在示例数据中,id4只有一个条目B,因此B- …我如何得到这样的数据帧:
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()功能,但没有运气.