当我filter从dplyr包中使用以删除因子变量的级别时,filter也会删除NA值.这是一个例子:
library(dplyr)
set.seed(919)
(dat <- data.frame(var1 = factor(sample(c(1:3, NA), size = 10, replace = T))))
# var1
# 1 <NA>
# 2 3
# 3 3
# 4 1
# 5 1
# 6 <NA>
# 7 2
# 8 2
# 9 <NA>
# 10 1
filter(dat, var1 != 1)
# var1
# 1 3
# 2 3
# 3 2
# 4 2
Run Code Online (Sandbox Code Playgroud)
这似乎并不理想 - 我只想把行放在哪里var1 == 1. …
我有大约100个有序类别的数据.我想将每个类别分别绘制为一条线,线条颜色范围从低值(比如蓝色)到高值(比如红色).
这是一些示例数据和一个图.
# Example data: normal CDFs
library(ggplot2)
category <- 1:100
X <- seq(0, 1, by = .1)
df <- data.frame(expand.grid(category, X))
names(df) <- c("category", "X")
df <- within(df, {
Y <- pnorm(X, mean = category / 100)
category <- factor(category)
})
# Plot with ggplot
qplot(data = df, x = X, y = Y, color = category, geom = "line")
Run Code Online (Sandbox Code Playgroud)
这会产生漂亮的彩虹(下图)
但我宁愿从蓝色到红色渐变.我有什么想法可以做到这一点?
我正在尝试为data.frame中的每个变量名添加一个公共前缀.例如,使用mtcars数据,我可以添加前缀"cars".使用以下代码:
> data(mtcars)
> names(mtcars)
[1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs"
[9] "am" "gear" "carb"
> names(mtcars) <- paste0("cars.", names(mtcars))
> names(mtcars)
[1] "cars.mpg" "cars.cyl" "cars.disp" "cars.hp"
[5] "cars.drat" "cars.wt" "cars.qsec" "cars.vs"
[9] "cars.am" "cars.gear" "cars.carb"
Run Code Online (Sandbox Code Playgroud)
但是,我想%>%使用一些dplyr语法将其作为管道操作的一部分(即,使用串联的一系列函数).这似乎是一些组合rename和everything()应该做的伎俩,但我不知道如何让它工作.有没有人有任何想法?
假设我有关于在多个选项之间进行选择的人的数据.我每人有一排,我希望每人有一排和选择.所以,如果我有10个人有3个选择,现在我有10行,我想有30个.
应将所有其他变量复制到每个新行.因此,例如,如果我有一个性别变量,那么它应该在ID内保持不变.(我正在以这种方式设置我的数据以进行分析mnlogit.)
这似乎是两个tidyr功能的情况,complete并且fill是为此而设计的.使用一个简单的例子:
library(lubridate)
library(tidyr)
dat <- data.frame(
id = 1:3,
choice = 5:7,
c = c(9, NA, 11),
d = ymd(NA, "2015-09-30", "2015-09-29")
)
dat %>%
complete(id, choice) %>%
fill(everything())
# Source: local data frame [9 x 4]
#
# id choice c d
# (int) (int) (dbl) (time)
# 1 1 5 9 <NA>
# 2 1 6 9 <NA>
# 3 1 7 9 <NA>
# 4 2 5 …Run Code Online (Sandbox Code Playgroud) 在下图中,为什么geom_density而stat_density(geom = "line")给出不同的结果?
library(ggplot2)
df <- data.frame(
x.values = c(
rnorm(100, mean = 1, sd = 1),
rnorm(100, mean = 4, sd = 1),
rnorm(100, mean = 7, sd = 1),
rnorm(100, mean = 10, sd = 1)
),
mean.values = sort(rep(c(1, 4, 7, 10), 100))
)
p <- ggplot(df, aes(x = x.values, color = mean.values, group = mean.values))
p + geom_density()
Run Code Online (Sandbox Code Playgroud)
p + stat_density(geom = "line")
Run Code Online (Sandbox Code Playgroud)
当我尝试在 data.table 上使用row_number()fromdplyr时,它会引发错误。下面是一个例子:
library(dplyr)
library(data.table)
mine <- data.table(a = 1:10)
mine %>% mutate(row_number())
# Error in rank(x, ties.method = "first", na.last = "keep") :
# argument "x" is missing, with no default
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会发生这种情况?
说我有一个向量列表.我想要列出该列表中的唯一向量及其频率.我可以得到一个唯一值的列表unique,但我无法弄清楚如何获得计数的向量.
my.list <- list(c(1, 1, 0), c(1, 1, 0))
> unique(my.list) # gives correct answer
# [[1]]
# [1] 1 1 0
Run Code Online (Sandbox Code Playgroud)
现在我想要的东西给了我一个unique(my.list)重复每个元素的次数的向量.在这种情况下,它应该是带元素的向量2.
使用table不起作用,因为它分别取向量的每个元素(0和1值):
> table(my.list)
# my.list.2
# my.list.1 0 1
# 0 1 0
# 1 0 2
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我宁愿不将paste这些变成一个字符串,然后如果我可以帮助它,则将它们重新分成矢量.
我正在使用 R 包stargazer创建高质量的回归表,我想用它来创建汇总统计表。我的数据中有一个因子变量,我希望汇总表显示因子在每个类别中的百分比——实际上,将因子分成一组互斥的逻辑(虚拟)变量,然后显示表中的那些。下面是一个例子:
> library(car)
> library(stargazer)
> data(Blackmore)
> stargazer(Blackmore[, c("age", "exercise", "group")], type = "text")
==========================================
Statistic N Mean St. Dev. Min Max
------------------------------------------
age 945 11.442 2.766 8.000 17.920
exercise 945 2.531 3.495 0.000 29.960
------------------------------------------
Run Code Online (Sandbox Code Playgroud)
但我试图获得一个额外的行,显示每组中的百分比(在这些数据中,% 控制和/或 % 患者)。我确定这只是观星者某个地方的一个选项,但我找不到它。有谁知道它是什么?
编辑:car::Blackmoor已将拼写更新为car::Blackmore.
我正在尝试为一组回归创建观星表,在该表中,我对数据的一个子集运行了每个回归。我认为,执行此操作的自然方法是使用split从我的数据创建data.frames列表,使用data.frames列表创建lm对象lapply列表,然后将该列表提供给stargazer。例如,
library(MASS)
library(stargazer)
data(Boston)
# This doesn't work
by.river <- split(Boston, Boston$chas)
fit <- lapply(by.river, lm, formula = crim ~ indus)
stargazer(fit, type = "text")
# % Error: Unrecognized object type.
# % Error: Unrecognized object type.
Run Code Online (Sandbox Code Playgroud)
如果我将它们手动分割,效果很好:
# This works
fit2 <- vector(mode = "list", length = 2)
fit2[[1]] <- lm(crim ~ indus, data = Boston, subset = (chas == 0))
fit2[[2]] <- lm(crim ~ indus, data = Boston, subset = (chas == …Run Code Online (Sandbox Code Playgroud) 使用data.table,假设我使用两列设置密钥,其中一列缺少值.数据表似乎将NA值排序为第一个值.
require(data.table)
set.seed(919)
# Create sample data
dt <- data.table(
key1 = rep(1:10, each = 10),
key2 = rep_len(letters, 100)
)
# Set some key2 values to missing
dt[sample(1:100, 10), "key2"] <- NA
# Set key (sort)
setkeyv(dt, c("key1", "key2"))
dt
# 1: 1 NA
# 2: 1 a
# 3: 1 b
# 4: 1 c
# 5: 1 d
# 6: 1 f
# 7: 1 g
# 8: 1 h
# 9: 1 i
# …Run Code Online (Sandbox Code Playgroud) 假设我想创建一个从R中的data.table计算摘要数据集的函数,我希望能够以编程方式传递新计算变量的名称.
例如:
library(data.table)
# generate some fake data
set.seed(919)
dt <- data.table(x = rnorm(50), by.var = rep(c("a", "b"), 25))
dt[, list(group.means = mean(x)), by = "by.var"] # This is what I want
# But I want to do in a function, so I can do it repeatedly:
groupMeans <- function(out.var, by.var, dat = dt) {
return(dat[, list(out.var = mean(x)), by = by.var]) # doesn't work
}
groupMeans("group.means", "by.var") # out.var should be "group.means"
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?