我想为data.frame中的大多数变量名添加后缀或前缀,通常是在它们以某种方式进行转换之后和执行连接之前.如果不打破我的管道,我没有办法做到这一点.
例如,使用此数据:
library(dplyr)
set.seed(1)
dat14 <- data.frame(ID = 1:10, speed = runif(10), power = rpois(10, 1),
force = rexp(10), class = rep(c("a", "b"),5))
Run Code Online (Sandbox Code Playgroud)
我想得到这个结果(注意变量名称):
class speed_mean_2014 power_mean_2014 force_mean_2014
1 a 0.5572500 0.8 0.5519802
2 b 0.2850798 0.6 1.0888116
Run Code Online (Sandbox Code Playgroud)
我目前的做法是:
means14 <- dat14 %>%
group_by(class) %>%
select(-ID) %>%
summarise_each(funs(mean(.)))
names(means14)[2:length(names(means14))] <- paste0(names(means14)[2:length(names(means14))], "_mean_2014")
Run Code Online (Sandbox Code Playgroud)
有没有替代那个笨重的最后一行打破我的管道?我看select()
和rename()
,但不想明确指定每个变量的名字,因为我通常希望将所有重命名,除了单个变量,并可能有一个更广泛的data.frame比这个例子.
我正在想象一个最近的管道命令,它近似于这个组成的函数:
appendname(cols = 2:n, str = "_mean_2014", placement = "suffix")
Run Code Online (Sandbox Code Playgroud)
据我所知,这不存在.
如何使用以下方法简化或执行以下操作dplyr
:
对所有data.frame
名称运行一个函数mutate_each(funs())
,例如值
names(iris) <- make.names(names(iris))
Run Code Online (Sandbox Code Playgroud)删除不存在的列(即删除任何内容),例如
iris %>% select(-matches("Width")) # ok
iris %>% select(-matches("X")) # returns empty data.frame, why?
Run Code Online (Sandbox Code Playgroud)按名称(字符串)添加新列,例如
iris %>% mutate_("newcol" = 0) # ok
x <- "newcol"
iris %>% mutate_(x = 0) # adds a column with name "x" instead of "newcol"
Run Code Online (Sandbox Code Playgroud)重命名不存在的data.frame colname
names(iris)[names(iris)=="X"] <- "Y"
iris %>% rename(sl=Sepal.Length) # ok
iris %>% rename(Y=X) # error, instead of no change
Run Code Online (Sandbox Code Playgroud)我希望我的ggplot2主题使用一组特定的颜色,但是看不到如何避免主题之外的单独一行.
我有这些数据:
library(ggplot2)
mycars <- mtcars
mycars$cyl <- as.factor(mycars$cyl)
Run Code Online (Sandbox Code Playgroud)
这是我绘制的虚拟主题:
mytheme <- theme(panel.grid.major = element_line(size = 2))
ggplot(mycars, aes(x = wt, y = mpg)) +
geom_point(aes(color = cyl)) +
mytheme
Run Code Online (Sandbox Code Playgroud)
我希望点颜色默认为我的自定义调色板:
mycolors <- c("deeppink", "chartreuse", "midnightblue")
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式将其添加到我的ggplot2主题,以便我不会在最后重复这些额外的代码行:
ggplot(mycars, aes(x = wt, y = mpg)) +
geom_point(aes(color = cyl)) +
mytheme +
scale_color_manual(values = mycolors)
Run Code Online (Sandbox Code Playgroud)
我试过了:
mytheme2 <- mytheme + scale_color_manual(values = mycolors)
Run Code Online (Sandbox Code Playgroud)
但得到了:
错误:不知道如何将scale_color_manual(values = mycolors)添加到主题对象
如何将纬度和经度坐标转换为R中的地址/人类可读位置?
例如,我有以下数据:
humandate lat lon
09/10/2014 13:41 41.83174254 -75.87998774
09/10/2014 13:53 41.83189873 -75.87994957
Run Code Online (Sandbox Code Playgroud)
我想知道纬度41.83174254,经度-75.87998774的地址/位置.R有可能吗?还是别的什么?
我有一个简单的问题.我花了大约一个小时左右寻找解决方案,但显然遗漏了一些东西.如果这确实是重复,请链接我以正确的方式执行此操作:
示例数据:
names <- c("Cycling1.opr", "Cycling2.opr", "Cycling3.opr")
mydf1 <- data.frame(V1=c(1:5), V2=c(21:25))
mydf2 <- data.frame(V1=c(1:10), V2=c(21:30))
mydf3 <- data.frame(V1=c(1:30), V2=c(21:50))
opr <- list(mydf1,mydf2,mydf3)
mydf4 <- data.frame(timestamp=c(1:5))
mydf5 <- data.frame(timestamp=c(1:10))
mydf6 <- data.frame(timestamp=c(1:30))
timestamp <- list(mydf4,mydf5,mydf6)
names(opr) <- names
names(timestamp) <- names
Run Code Online (Sandbox Code Playgroud)
每个列表(opr和timestamp)始终具有相同数量的data.frames,并且当具有相同的名称时,这些data.frames中的每一个始终具有相同的长度.我想做的是将每个类似命名的数据帧合并到一个数据帧中作为最终列表(可能名为finalopr)的一部分,使其结构如下所示.
dput(finalopr)
list(structure(list(V1 = 1:5, V2 = 21:25, timestamp = 1:5), .Names = c("V1",
"V2", "timestamp"), row.names = c(NA, -5L), class = "data.frame"),
structure(list(V1 = 1:10, V2 = 21:30, timestamp = 1:10), .Names = c("V1",
"V2", "timestamp"), row.names = c(NA, …
Run Code Online (Sandbox Code Playgroud) 以下是此示例的玩具数据集:
data <- data.frame(x=rep(c("red","blue","green"),each=4), y=rep(letters[1:4],3), value.1 = 1:12, value.2 = 13:24)
x y value.1 value.2
1 red a 1 13
2 red b 2 14
3 red c 3 15
4 red d 4 16
5 blue a 5 17
6 blue b 6 18
7 blue c 7 19
8 blue d 8 20
9 green a 9 21
10 green b 10 22
11 green c 11 23
12 green d 12 24
Run Code Online (Sandbox Code Playgroud)
如何转换或传播变量y,以生成以下宽数据.frame:
x a.value.1 b.value.1 c.value.1 …
Run Code Online (Sandbox Code Playgroud) 我有一个data.frame,其中一些单元格包含逗号分隔值的字符串:
d <- data.frame(a=c(1:3),
b=c("name1, name2, name3", "name4", "name5, name6"),
c=c("name7","name8, name9", "name10" ))
Run Code Online (Sandbox Code Playgroud)
我想将每个名称拆分为自己的单元格的字符串分开.这很容易
tidyr::separate_rows(d, b, sep=",")
Run Code Online (Sandbox Code Playgroud)
如果一次完成一列.但我不能同时对"b"和"c"这两列执行此操作,因为它要求每个字符串中的名称数相同.而不是写作
tidyr::separate_rows(d, b, sep=",")
tidyr::separate_rows(d, c, sep=",")
Run Code Online (Sandbox Code Playgroud)
有没有办法在单行中执行此操作,例如使用apply?就像是
apply(d, 2, separate_rows(...))
Run Code Online (Sandbox Code Playgroud)
不知道如何将参数传递给separate_rows()
函数.
如果我在R中有一个线性模型的汇总表,我怎样才能得到仅与交互估计相关联的p值,或者只是组拦截等,而不必计算行数?
例如,对于lm(y ~ x + group)
具有x
连续和group
分类的模型,lm
对象的汇总表具有以下估计值:
我想找出一种方法将每个这些作为一组p值,即使组的数量或模型公式发生变化.也许汇总表以某种方式用于将行组合在一起的信息?
以下是具有两个不同模型的示例数据集.第一个模型有四组不同的p值我可能想单独得到,而第二个模型只有两组p值.
x <- 1:100
groupA <- .5*x + 10 + rnorm(length(x), 0, 1)
groupB <- .5*x + 20 + rnorm(length(x), 0, 1)
groupC <- .5*x + 30 + rnorm(length(x), 0, 1)
groupD <- .5*x + 40 + rnorm(length(x), 0, 1)
groupE <- .5*x + 50 + rnorm(length(x), 0, 1)
groupF <- .5*x + 60 + rnorm(length(x), 0, 1)
myData <- data.frame(x …
Run Code Online (Sandbox Code Playgroud) 使用包dplyr和函数 sample_frac
可以从每个组中采样百分比.我需要的是首先对每个组中的元素进行排序,然后从每个组中选择前x%?
有一个功能 top_n
,但在这里我只能确定行数,我需要一个相对值.
例如,以下数据按齿轮分组并按其排序 wt
每组内的:
library(dplyr)
mtcars %>%
select(gear, wt) %>%
group_by(gear) %>%
arrange(gear, wt)
gear wt
1 3 2.465
2 3 3.215
3 3 3.435
4 3 3.440
5 3 3.460
6 3 3.520
7 3 3.570
8 3 3.730
9 3 3.780
10 3 3.840
11 3 3.845
12 3 4.070
13 3 5.250
14 3 5.345
15 3 5.424
16 4 1.615
17 4 1.835
18 4 1.935
19 4 2.200
20 4 …
Run Code Online (Sandbox Code Playgroud) 我经常需要在另一个函数内创建一个函数调用,然后进行评估.我倾向于使用eval(parse(text = "what_needs_to_be_done"))
,使用构造的文本paste0()
.但是,这并不是一种好方法.这是一个例子:
select_data <- function(x, A = NULL, B = NULL, C = NULL) {
kall <- as.list(match.call())
vars <- names(kall)[names(kall) %in% c("A", "B", "C")]
selection_criteria <- paste0(vars, " == ", kall[vars], collapse = ", ")
txt <- paste0("dplyr::filter(x, ", selection_criteria, ")")
res <- eval(parse(text = txt))
return(res)
}
DF <- data.frame(A = c(1,1,2,2,3,3), B = c(1,2,1,2,1,2), C = c(1,1,1,2,2,2))
select_data(DF, A = 2, C = 2)
Run Code Online (Sandbox Code Playgroud)
这只是一个例子,在大多数情况下,要构建的功能更复杂和更广泛.但是,该示例显示了一般问题.我现在做的首先paste0
是函数调用,我在控制台输入它然后评估它的方式.
我已经篡改了与替代办法substitute
,lazyeval
, …