小编J.S*_*ree的帖子

R 中 !is.na() 的 filter_all 仍然会产生缺失值

我正在尝试使用 dplyr 的 filter_all() 来生成没有任何缺失数据的所有行。我正在使用 dplyr 内置的 starwars 数据集。当我使用此代码生成确实有任何缺失值的代码时,它可以无缝地工作:

 library(dplyr)
 data("starwars")

rows_with_NAs <- starwars %>%
  filter_all(any_vars(is.na(.)))
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用此代码查找没有任何缺失值的行:

rows_without_NAs <- starwars %>%
  filter_all(any_vars(!is.na(.)))
Run Code Online (Sandbox Code Playgroud)

我仍然得到带有 NA 的行。

head(rows_without_NAs)
Run Code Online (Sandbox Code Playgroud)

为什么会这样,我该如何解决?

谢谢!

filtering r filter na dplyr

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

跨列使用 case_when 创建新列

我有一个大型数据集,其中包含许多带有状态的列。我想创建一个包含参与者当前状态的新专栏。我正在尝试在 dplyr 中使用 case_when,但我不确定如何跨列。数据集的列太多,我无法输入每一列。以下是数据示例:

library(dplyr)
problem <- tibble(name = c("sally", "jane", "austin", "mike"),
                  status1 = c("registered", "completed", "registered", "no action"),
                  status2 = c("completed", "completed", "registered", "no action"),
                  status3 = c("completed", "completed", "withdrawn", "no action"),
                  status4 = c("withdrawn", "completed", "no action", "registered"))
Run Code Online (Sandbox Code Playgroud)

对于代码,我想要一个新列,说明参与者的最终状态;但是,如果他们的地位不断被完成,那么我想它说完成,无论其最终状态是什么。对于此数据,答案如下所示:


answer <- tibble(name = c("sally", "jane", "austin", "mike"),
                 status1 = c("registered", "completed", "registered", "no action"),
                 status2 = c("completed", "completed", "registered", "no action"),
                 status3 = c("completed", "completed", "withdrawn", "no action"),
                 status4 = c("withdrawn", "completed", "no action", "registered"), …
Run Code Online (Sandbox Code Playgroud)

string r case-when conditional-statements dplyr

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

case_when 与部分字符串匹配和 contains()

我正在使用一个数据集,其中有许多名为 status1、status2 等的列。在这些列中,它表示某人是否豁免、完整、注册等。

不幸的是,豁免投入并不一致;这是一个示例:

library(dplyr)

problem <- tibble(person = c("Corey", "Sibley", "Justin", "Ruth"),
                  status1 = c("7EXEMPT", "Completed", "Completed", "Pending"),
                  status2 = c("exempt", "Completed", "Completed", "Pending"),
                  status3 = c("EXEMPTED", "Completed", "Completed", "ExempT - 14"))
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 case_when() 来创建一个具有最终状态的新列。如果它说已完成,那么它们就已完成。如果它说豁免但没有说完整,那么他们就豁免了。

重要的部分是我希望我的代码使用 contains("status") 或一些仅针对状态列且不需要全部键入的等效项,并且我希望它只需要部分字符串匹配即可豁免。

至于将 contains 与 case_when 一起使用,我看到了这个示例,但我无法将其应用到我的案例中:mutate with case_when and contains

这是我到目前为止尝试使用的,但正如你可以猜到的,它没有起作用:

library(purrr)
library(dplyr)
library(stringr)
solution <- problem %>%
  mutate(final= case_when(pmap_chr(select(., contains("status")), ~
    any(c(...) == str_detect(., "Exempt") ~ "Exclude",
               TRUE ~ "Complete"
  ))))
Run Code Online (Sandbox Code Playgroud)

这是我想要的最终产品的样子:

solution <- tibble(person = c("Corey", "Sibley", "Justin", "Ruth"), …
Run Code Online (Sandbox Code Playgroud)

string r contains stringr dplyr

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

在运算符中使用 %in% 并在 R 中选择

我有一个数据集,我想计算某些列的每个参与者的参与率(非 NA 的数量/总列)。实际数据集有许多我想忽略的列。

为此,假设我只想知道 item 和 score 列(5 列)中的参与率,而忽略 name 和 email 列。此代码有效:

library(tidyverse)

data <- tibble(name = c("Corey", "Sibley", "Justin"),
               item_1 = c(1, 2, NA),
               item_2 = c(1, NA, NA),
               item_3 = c(2, NA, NA),
               item_4 = c(3, 2, NA),
               score = c(NA,NA, 1),
               email = c("on file", "on file", "on file"))

data %>%
  mutate(part_rate = rowSums(!is.na(select(., -c(name, email))))/5 * 100)

Run Code Online (Sandbox Code Playgroud)

但是,在实际数据集中,我对不同的参与者有不同的分母(5 个),因此我只想列出要排除/包含的列一次。我试过这个,但它不起作用:


columns_to_exclude <- c("email", "name")

data %>%
  mutate(part_rate = rowSums(!is.na(select(., !%in% columns_to_exclude)))/5 * 100)

Run Code Online (Sandbox Code Playgroud)

有什么办法可以让我们在这个选择中使用 in 运算符,这样我就可以避免多次复制和粘贴相同的列来排除吗? …

select r in-operator rowsum dplyr

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

如何在flextable header中有多种字体大小?

我有一个 flextable(),我想让标题有两种字体大小。主要文本的一种尺寸(例如,20 pt 字体),以及较小的括号文本(12 pt 字体)。这是使整个标题为 20 pt 的代码。

注意:在最终解决方案中,我不希望括号文本成为一个全新的行,除非它可以像下面的示例所示一样接近原始文本。

library(flextable)
library(dplyr)

set_flextable_defaults(font.size = 20) #Works but makes all header size 20

flextable(test) %>%
  set_header_labels(values = list(name = "Name", med_score = "Score (Median)", mean_score = "Score (Mean)")) %>%
  align(align = "center", part = "header")
Run Code Online (Sandbox Code Playgroud)

编辑:添加图片

这是目前的样子:

在此处输入图片说明

这就是我想要的样子:

在此处输入图片说明

注意:我在 PowerPoint 中制作了这个目标表。它在很多方面看起来与原始版本不同,因为我没有格式化原始版本。我试图复制的唯一区别是(中值)和(平均值)小于 Score 以及它们位于同一个标题单元格中。

r header font-size flextable

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

当 multiple 为 true 时,如何限制用户可以使用 R闪亮的 selectInput 选择的选项数量?

我有一个 Shiny 应用程序,我希望用户能够选择多个选项,但仅限于一定的限制。我找不到限制数量的方法。

下面是一个简单的、可重现的示例。在其中,我的用户只能为第一个问题选择最多 2/4 个选项,为第二个问题选择最多 3/4 个选项,为第三个问题选择任意数量的选项(问题无需编辑) 3)。

library(shiny)

ui <- fluidPage(
  
  
  sidebarLayout(
    sidebarPanel(                     selectInput("q1", label = "Choose up to 2.", choices = c(" ", "option 1", "option 2", "option 3", "option 4"), multiple = TRUE),
                                      selectInput("q2", label = "Choose up to 3.", choices = c(" ", "option 1", "option 2", "option 3", "option 4"), multiple = TRUE),
                                      selectInput("q3", label = "Choose as many as you want.", choices = c(" ", "option 1", "option 2", "option 3", "option 4"), …
Run Code Online (Sandbox Code Playgroud)

r shiny shinydashboard selectinput

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

使用 R 中的半正矢公式和自定义函数查找两个城市之间的距离

我正在尝试使用 R 查找两点之间的距离。虽然我已经看到了其他答案(从数据框到特定位置查找最近的城市),但我想使用特定的公式来计算以英里为单位的距离。在另一个网站(https://andrew.hedges.name/experiments/haversine/)上,我发现 Java 中的这段代码在 GUI 中给出了正确的距离:

dlon = lon2 - lon1 
dlat = lat2 - lat1 
a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2 
c = 2 * atan2( sqrt(a), sqrt(1-a) ) 
d = 3961 * c
Run Code Online (Sandbox Code Playgroud)

然后我将其转换为 R 中的函数:

geo_distance <- function(lon2, lon1, lat2, lat1){
  dlon <- lon2 - lon1
  dlat <- lat2 - lat1
  a <- (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2
  c <- 2 * atan2(sqrt(a), sqrt(1-a))
  d <- 3961 …
Run Code Online (Sandbox Code Playgroud)

geocoding r function distance haversine

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

使用带有计数和百分比的 Plotly 在 R 中打开饼图/甜甜圈图

我正在尝试使用 plotly 在 R 中制作甜甜圈图。我尝试了 ggplot,但它无法给我所需的效果。这是一个示例数据集:

library(dplyr)
testfile <- tibble(personID = 1:10,
                   status = c("bad", "good", "bad", "bad", "bad", "bad", "bad", "bad", "bad", "good"),
                   department = c("sales", "sales", "marketing", "sales", "marketing", "management", "management", "sales", "sales", "sales"))
Run Code Online (Sandbox Code Playgroud)

此图表最终会出现在 PowerPoint 中,因此它不需要响应。相反,我需要饼图来说明,而不是滚动它,属于每个状态的百分比计数。此外,在饼图的中心,我希望它表示“好”类别中的百分比。

这是我到目前为止的代码。它具有无需滚动即可看到的百分比,但没有计数,并且中心没有百分比。

library(plotly)
p <- testfile %>%
  group_by(status) %>%
  summarize(count = n()) %>%
  plot_ly(labels = ~status, values = ~count) %>%
  add_pie(hole = 0.6) %>%
  layout(title = "Ratio of Good to Bad",  showlegend = F,
         xaxis = list(showgrid = FALSE, zeroline …
Run Code Online (Sandbox Code Playgroud)

charts r count donut-chart plotly

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

ggplot 将文本添加到 R 中圆环图的中心

我正在使用 ggplot2 处理圆环图,但我需要绘图的中心来包含文本。

这是示例数据(从该站点找到:https : //www.datanovia.com/en/blog/how-to-create-a-pie-chart-in-r-using-ggplot2/):

library(dplyr)
count.data <- data.frame(
  class = c("1st", "2nd", "3rd", "Crew"),
  n = c(325, 285, 706, 885),
  prop = c(14.8, 12.9, 32.1, 40.2)
)
count.data <- count.data %>%
  arrange(desc(class)) %>%
  mutate(lab.ypos = cumsum(prop) - 0.5*prop)
count.data
Run Code Online (Sandbox Code Playgroud)

然后我修改了他们的代码以获得这个甜甜圈图:

library(ggplot2)
library(dplyr)

mycols <- c("#0073C2FF", "#EFC000FF", "#868686FF", "#CD534CFF")

ggplot(count.data, aes(x = 2, y = prop, fill = class)) +
  geom_bar(stat = "identity", color = "white") +
  coord_polar(theta = "y", start = 0)+
  geom_text(aes(y = lab.ypos, label …
Run Code Online (Sandbox Code Playgroud)

text r data-visualization ggplot2 donut-chart

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

使用 %in% 运算符在 R 中进行部分字符串匹配?

我很想知道是否可以使用 R 中的 %in% 运算符进行部分字符串匹配。我知道有很多方法可以使用 stringr 等来查找部分字符串匹配,但我当前的代码使用起来更容易%in% 运算符。

例如,想象这个向量:

x <- c("Withdrawn", "withdrawn", "5-Withdrawn", "2-WITHDRAWN", "withdrawnn")
Run Code Online (Sandbox Code Playgroud)

我希望这些都为真,因为字符串包含“撤回”,但只有第一个为真:

x %in% c("Withdrawn")
[1]  TRUE FALSE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

我尝试使用正则表达式至少使其不区分大小写,但这使一切都变得错误:

x %in% c("(?i)Withdrawn")
[1] FALSE FALSE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

那么,是否有可能使用带有包装器的 %in% 运算符在所有这些上产生 TRUE?因为它很容易使用tolower的()或TOUPPER(),我不是因为关心区分大小写; 然而,对我来说重要的是代码会触发“撤销”、“撤销”和“5-撤销”。

编辑:这个问题被标记为这个问题的副本R 中的列表不区分大小写搜索;但是,它是不同的,因为它询问是否可以使用 %in% 运算符进行部分字符串匹配。链接的问题根本不使用 %in% 运算符。

regex string r string-matching in-operator

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

在 R 中,如何给出一个字符串向量以使其成为空列?

如果我有一个字符串向量,如何轻松地将它们制作成附加到数据框上的列标题?我知道我可以一对一地使用 cbind,但是有没有办法一次性完成它?

library(dplyr)
my_new_cols <- c("n_a", "n_b", "n_c")

current_data <- tibble(id = c(1:4),
                       score = c(10, 20, 30, 40))

desired_output <- tibble(id = c(1:4),
                       score = c(10, 20, 30, 40),
                       n_a = NA,
                       n_b = NA,
                       n_c = NA)
~~~~~
Run Code Online (Sandbox Code Playgroud)

r

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

if 语句在 for 循环中被忽略

我正在编写一个基本的 for 循环,其中除最后一行之外的所有输出都应该相同。然而,即使条件是 ,我的 if 语句仍然被忽略TRUE

test_string <- c("test", "test2", "test3")

i <- 1
for(i in length(test_string)) {
  answer <- if(i < length(test_string)) {
    paste0("This is not the last '%", test_string, "%'")

  } else{
    paste0("This IS the LAST '%", test_string, "%'")
  }
  i <- i+1
}

#> [1] "This IS the LAST '%test%'"  "This IS the LAST '%test2%'"
#> [3] "This IS the LAST '%test3%'"
Run Code Online (Sandbox Code Playgroud)

for-loop if-statement r

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

使用 R 的 tidyverse,过滤掉多列中满足条件的数据的最有效方法是什么?

我有一个数据集,我想过滤掉一个人最喜欢的颜色是绿色并且他们最喜欢的食物是寿司。但是,如果此人仅满足其中一项标准,我想保留他们。在这种情况下,我如何才能最有效地转换这个数据集:

library(dplyr)

test <- tibble(person = c("Justin", "Corey", "Kate", "Sibley"),
               fav_food = c("sushi", "sushi", "cake", "tomatos"),
               fav_color = c("green", "red", "green", "blue"))
Run Code Online (Sandbox Code Playgroud)

到这个数据集?

library(dplyr)
answer <- tibble(person = c("Corey", "Kate", "Sibley"),
               fav_food = c("sushi", "cake", "tomatos"),
               fav_color = c("red", "green", "blue"))
Run Code Online (Sandbox Code Playgroud)

我当前的解决方案是创建一个新变量,它是这两列的组合,但我觉得似乎必须有一个比这更直接的解决方案:

library(dplyr)

#code works but curious if there is a more straightforward approach

test %>%
  mutate(food_color = paste(fav_food, fav_color, sep = "-")) %>%
  filter(food_color != "sushi-green")
Run Code Online (Sandbox Code Playgroud)

r filter dplyr tidyverse

0
推荐指数
1
解决办法
115
查看次数