我有以下数据框:
library(tidyverse)
dat <- tribble(
~Scenario, ~V1, ~V2, ~V3, ~V4,
1, 0.97, 0.46, 0.79, 0.25,
1, 0.21, 0.45, 0.23, 0.63,
1, 0.95, 0.97, 0.07, 0.61,
1, 0.93, 0.79, 0.23, 0.86,
2, 0.22, 0.01, 0.42, 0.47,
2, 0.71, 0.17, 0.16, 0.88,
3, 0.73, 0.38, 0.10, 0.77,
3, 0.49, 0.37, 0.90, 0.52,
3, 0.99, 0.71, 0.66, 0.05,
3, 0.72, 0.75, 0.69, 0.01,
3, 0.15, 0.87, 0.12, 0.02,
4, 0.94, 0.30, 0.91, 0.99)
Run Code Online (Sandbox Code Playgroud)
我向该数据添加四个新列,其中每个新列代表按以下分组的每个 V1:V4 列的总和Scenario
:
dat_new <- dat %>%
group_by(Scenario) …
Run Code Online (Sandbox Code Playgroud) 我试图将.sav文件读入R但是我收到以下警告:
library("memisc")
dataset <- data.frame(as.data.set(spss.system.file("dataset.sav")))
Run Code Online (Sandbox Code Playgroud)
parseSysHeader(ptr):file缺少info_flt64记录,使用默认值
有人能告诉我这个警告意味着什么,以及如何解决它?任何帮助,将不胜感激.
谢谢
孝弘
我正在努力收紧%>%
管道工作流程,我需要将相同的函数应用于多个列,但每次更改一个参数.我觉得自己purrr
的map
或invoke
功能应该有所帮助,但我不能换我的头周围.
我的数据框有预期寿命,贫困率和家庭收入中位数的列.我可以将所有这些列名称传递给vars
in mutate_at
,round
用作应用于每个列的函数,并可选地提供digits
参数.但我无法想出一种方法,如果存在的话,传递digits
与每列相关联的不同值.我希望将预期寿命调整为1位数,将贫困率调整为2,将收入调整为0.
我可以调用mutate
每一列,但考虑到我可能有更多的列都接收相同的函数,只更改了一个额外的参数,我想要更简洁的东西.
library(tidyverse)
df <- tibble::tribble(
~name, ~life_expectancy, ~poverty, ~household_income,
"New Haven", 78.0580437642378, 0.264221051111753, 42588.7592521085
)
Run Code Online (Sandbox Code Playgroud)
在我的想象中,我可以这样做:
df %>%
mutate_at(vars(life_expectancy, poverty, household_income),
round, digits = c(1, 2, 0))
Run Code Online (Sandbox Code Playgroud)
但得到错误
mutate_impl(.data,dots)中的错误:列
life_expectancy
必须是长度1(行数),而不是3
使用mutate_at
而mutate
不仅仅是在我的理想情况下使用相同的语法:
df %>%
mutate_at(vars(life_expectancy), round, digits = 1) %>%
mutate_at(vars(poverty), round, digits = 2) %>%
mutate_at(vars(household_income), round, digits = 0)
#> # A …
Run Code Online (Sandbox Code Playgroud) 我想转换以下格式:
mydata <- data.frame(movie = c("Titanic", "Departed"),
actor1 = c("Leo", "Jack"),
actor2 = c("Kate", "Leo"))
movie actor1 actor2
1 Titanic Leo Kate
2 Departed Jack Leo
Run Code Online (Sandbox Code Playgroud)
二进制响应变量:
movie Leo Kate Jack
1 Titanic 1 1 0
2 Departed 1 0 1
Run Code Online (Sandbox Code Playgroud)
我尝试了将行数据转换为二进制列中描述的解决方案, 但我可以让它适用于两个变量,而不是三个.
如果有一个干净的方法,我真的很感激.
这是我之前在代码中编写过故障保护功能的一个问题,但是我想知道是否有更简单的事情我错过了。
有时,我有2个(或更多)包含不同类型信息的列表,这些信息需要与某个功能配合使用,例如- map2
考虑一个命名ggplot
对象列表和一个文件路径命名列表,以保存每个对象的输出。是否有内置或轻松添加到管道工作流中的方法来确保列表项按名称而不是按位置匹配?
考虑一个简单的例子:
library(purrr)
evens <- list(a = 2, b = 4, c = 6, d = 8)
odds <- list(a = 11, d = 9, c = 7, b = 5)
Run Code Online (Sandbox Code Playgroud)
map2
返回名称与第一个列表相同的列表,并按位置进行迭代。因此,无法解决项目b
和d
被切入的事实odds
,并且这两个调用产生不同的结果:
map2(evens, odds, function(l1, l2) {
paste(l1, l2)
})
#> $a
#> [1] "2 11"
#>
#> $b
#> [1] "4 9"
#>
#> $c
#> [1] "6 7"
#>
#> $d
#> [1] "8 …
Run Code Online (Sandbox Code Playgroud) 我收到一个dplyr::bind_rows
错误。这是一个非常微不足道的问题,因为我可以轻松绕过它,但我想了解错误消息的含义。
我有新英格兰各州一些人口群体的以下数据,我想绑定这些相同值的副本,并将名称更改为“新英格兰”,以便我可以按名称分组并将它们加起来,给我各个州的价值,以及该地区的整体价值。
df <- structure(list(name = c("CT", "MA", "ME", "NH", "RI", "VT"),
estimate = c(501074, 1057316, 47369, 76630, 141206, 27464)),
class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L))
Run Code Online (Sandbox Code Playgroud)
我这样做是作为更大的管道步骤流程的一部分,所以我不能只做bind_rows(df, df %>% mutate(name = "New England"))
. dplyr
为.
从一个函数传输到下一个函数的数据帧提供了方便的速记,但我不能使用它以我喜欢的方式将数据帧绑定到自身。
什么做的工作,让我我想要的输出:
library(tidyverse)
df %>%
# arbitrary piped operation
mutate(name = str_to_lower(name)) %>%
bind_rows(mutate(., name = "New England")) %>%
group_by(name) %>%
summarise(estimate = sum(estimate))
#> # A tibble: 7 x 2
#> name estimate
#> …
Run Code Online (Sandbox Code Playgroud) 我正在使用usethis
/ 处理R 包devtools
。这个包有一些我想保留在内部的对象,只是为了保持混乱。我使用的结构是根据对象的来源在不同文件中创建对象,所有对象都在我的data-raw
文件夹中。例如,该文件make_laus_codes.R
准备了来自劳工统计局(一个内部,称为laus_codes
)的查找代码的两个数据框,以及make_decennial_tables.R
来自十年一次人口普查(包括内部,decennial_nums
)的查找代码。
如果我调用类似usethis::use_data(data_name, internal = TRUE)
,如果sysdata.rda
文件已经创建并且我没有选择覆盖它,我会收到错误消息;如果我选择覆盖,它会覆盖整个内容,而不是我所期望的,即将第二个对象附加到sysdata.rda
.
在 sysdata.rda 中存储多个对象的公认答案:R-package development说要调用usethis::use_data(laus_codes, decennial_nums, internal = TRUE)
,但是那里的评论提出了一个问题,如果这些对象不是同时被创建会怎样,这就是我想要的地方捡起。
我的结构的简化版本如下:
数据原始/make_laus_codes.R:
laus_codes <- data.frame(
area = c("Connecticut", "Fairfield County", "Hartford County"),
code = c("ST0900000000000", "CN0900100000000", "CN0900300000000")
)
Run Code Online (Sandbox Code Playgroud)
数据原始/make_decennial_tables.R:
decennial_nums <- c("H002", "H003", "H004", "H005", "H006")
Run Code Online (Sandbox Code Playgroud)
数据原始/make_internal_data.R:
source("./make_laus_codes.R")
source("./make_decennial_tables.R")
usethis::use_data(laus_codes, decennial_nums, internal = TRUE)
Run Code Online (Sandbox Code Playgroud)
这有效,但感觉很尴尬,就像我错过了这样做的预期方法。有没有一种更好、更合适和/或意图的方法来做到这一点usethis
?以这种方式获取其他文件感觉容易受到错误和健忘的影响。
运行分析后,我尝试创建一个新文件夹并保存结果。我收到消息:
dir.create("results") 警告消息:在 dir.create("results") 中:无法创建 dir 'results',原因 '没有这样的文件或目录'
我有三个层次分类变量(A
,B
,和C
)。
我还有一个连续变量,上面有一些缺失值。
我想NA
用其组的平均值替换这些值。A
也就是说, group 中缺失的观察值必须替换为 group 的平均值A
。
我知道我可以计算每个组的平均值并替换缺失值,但我确信还有另一种方法可以通过循环更有效地做到这一点。
A <- subset(data, group == "A")
mean(A$variable, rm.na = TRUE)
A$variable[which(is.na(A$variable))] <- mean(A$variable, na.rm = TRUE)
Run Code Online (Sandbox Code Playgroud)
现在,我知道我可以对 group B
and做同样的事情C
,但也许for
循环(with if
and else
)可能会起作用?
我有一个像这样的购物清单数据:
df <- data.frame(id = 1:5, item = c("apple2milk5", "milk1", "juice3apple5", "egg10juice1", "egg8milk2"), stringsAsFactors = F)
# id item
# 1 1 apple2milk5
# 2 2 milk1
# 3 3 juice3apple5
# 4 4 egg10juice1
# 5 5 egg8milk2
Run Code Online (Sandbox Code Playgroud)
我想将变量item
分成多列,并记录货物后面的数字。我遇到的问题是每个人购买的商品都不一样,因此我无法使用tidyr::separate()
或其他类似功能来解决它。我期望的是:
# id apple milk juice egg
# 1 1 2 5 NA NA
# 2 2 NA 1 NA NA
# 3 3 5 NA 3 NA
# 4 4 NA NA 1 10
# 5 …
Run Code Online (Sandbox Code Playgroud)