小编Ano*_*n R的帖子

ivot_wider() 具有多个要保留的列

我有长格式数据,其结构如下(当然,多个国家、年份和变量):

df <- tribble(
  ~ind, ~country,    ~year, ~group, ~dummy,    ~v1,    ~v2,
  1,   "country 1",  1990, "A",         0,  2.53,  1.68, 
  2,   "country 1",  1990, "B",         0,  2.63, -5.21, 
  3,   "country 1",  1991, "A",         1,  6.54,  3.48, 
  4,   "country 1",  1991, "B",         1,  7.11,  2.52, 
  5,   "country 1",  1992, "A",         0,  2.69, -3.45, 
  6,   "country 1",  1992, "A",         0,  2.49, -3.45, 
  7,   "country 2",  1990, "A",         0,  2.73,  1.68, 
  8,   "country 2",  1990, "B",         0,  2.73, -1.21, 
  9,   "country 2",  1991, "A", …
Run Code Online (Sandbox Code Playgroud)

r tidyr

10
推荐指数
2
解决办法
2万
查看次数

如何用另一个数据框的数据填充一个数据框,同时保留第一个数据框的 NA

我有 2 个数据框,它们具有相同的列名,但行数不同。第一个数据框 (a) 看起来与此类似:

a = data.frame("Site"=c(1,2,3,4,7,9,10,11,13,14), 
               "v1"=c(0,0,0,0,0,0,0,0,0,0), 
               "v2"=c(0,0,0,0,NA,NA,NA,0,0,0), 
               "v3"=c(0,0,0,NA,0,NA,0,0,0,0), 
               "v4"=c(0,0,0,0,0,0,0,0,NA,NA), 
               "v5"=c(0,0,0,0,0,NA,0,NA,0,0)) 
Run Code Online (Sandbox Code Playgroud)

注意:站点 5、6、8 和 12 故意缺失。

第二个数据框 (b) 看起来像这样:

b = data.frame("Site"=c(2,3,4,7,10,14),
               "v1"=c(1,NA,2,1,NA,NA),
               "v2"=c(1,1,NA,NA,NA,NA),
               "v3"=c(NA,1,NA,NA,NA,1),
               "v4"=c(1,NA,4,1,NA,NA),
               "v5"=c(1,NA,2,1,1,3))
Run Code Online (Sandbox Code Playgroud)

我想要实现的是:

desired = data.frame("Site"=c(1,2,3,4,7,9,10,11,13,14), 
                     "v1"=c(0,1,0,2,1,0,0,0,0,0), 
                     "v2"=c(0,1,1,0,NA,NA,NA,0,0,0), 
                     "v3"=c(0,0,1,NA,0,NA,0,0,0,1), 
                     "v4"=c(0,1,0,4,1,0,0,0,NA,NA), 
                     "v5"=c(0,1,0,2,1,NA,1,NA,0,3))
Run Code Online (Sandbox Code Playgroud)

我将数据帧 b 中的数据“注入”(我确信有更好的术语)到数据帧 a 中,但是我想用零替换 b 中的任何 NA,并保持 a 中的 NA 原样。

我发现并尝试过这段代码:

cols <- colnames(a)[colnames(a) %in% colnames(b)]
rows <- rownames(a)[rownames(a) %in% rownames(b)]

a[rows, cols] <- b[rows, cols]
Run Code Online (Sandbox Code Playgroud)

但它也带来了 NA。我考虑先用零替换 NA,但即便如此,它也会删除我当前在数据帧 a 中想要保留的 NA。

也许 for 循环或 tidyverse 中的某些东西是可行的方法,但我什至不知道从哪里开始。任何帮助将非常感激!

r dataframe na dplyr

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

在 r 中的数据框中循环线性回归输出

我在下面有一个数据集,我想在其中对每个国家和州进行线性回归,然后在数据集中绑定预测值:

在此处输入图片说明

添加三列后的最终数据框:

在此处输入图片说明

我已经为一个国家和一个地区做了,但想为每个国家和地区做,把预测的上下限值放回cbind设置的数据中:

 data <- data.frame(country = c("US","US","US","US","US","US","US","US","US","US","UK","UK","UK","UK","UK"),
            Area = c("G","G","G","G","G","I","I","I","I","I","A","A","A","A","A"),
            week = c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5),amount = c(12,23,34,32,12,12,34,45,65,45,45,34,23,43,43))

data_1 <- data[(data$country=="US" & data$Area=="G"),]
model <- lm(amount ~ week, data = data_1)
pre <- predict(model,newdata = data_1,interval = "prediction",level = 0.95)
pre
Run Code Online (Sandbox Code Playgroud)

我如何为国家和地区的其他组合循环这个?

r lm

8
推荐指数
3
解决办法
159
查看次数

基于正则表达式合并数据框中的变量对

我想用来dplyr::coalesce查找包含多对变量的数据框中变量对之间的第一个非缺失值。目标是创建一个新的数据帧,现在每对变量只有一个副本(没有 NA 值的合并变量)。

这是一个例子:

df <- data.frame(
      A_1=c(NA, NA, 3, 4, 5),
      A_2=c(1, 2, NA, NA, NA),
      B_1=c(NA, NA, 13, 14, 15),
      B_2=c(11, 12, NA, NA, NA))


Expected output: 

A  B
1  11
2  12
3  13
4  14
5  15
Run Code Online (Sandbox Code Playgroud)

我猜测可以使用基于正则表达式的混合dplyr::coalescedplyr::mutate_at但我不知道该怎么做。有没有办法用 tidyverse 语法来完成这个任务?

谢谢!

编辑:感谢大家的回答!但是,我应该包含变量的命名约定,以便于将您的答案转移到我的实际问题上。对此我感到很抱歉。我的变量是地球化学变量,由两部分命名(化学元素名称加核心名称)。

示例:Al_TAC4.25.275其中Al是元素,TAC4.25.275是核心。我想为每个元素(名称的第一部分)合并来自 3 个不同核心(名称的第二部分)的数据。我有 25 对元素需要合并。

r coalesce dataframe dplyr purrr

8
推荐指数
3
解决办法
713
查看次数

使用 Summarize 和 dplyr 来按组对多个列的非“NA”进行计数

我想使用summarizeand acrossfrom来计算分组变量的dplyr非值数量。NA例如,使用这些数据:

library(tidyverse)  
d <- tibble(ID = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
            Col1 = c(5, 8, 2, NA, 2, 2, NA, NA, 1),
            Col2 = c(NA, 2, 1, NA, NA, NA, 1, NA, NA),
            Col3 = c(1, 5, 2, 4, 1, NA, NA, NA, NA))  
Run Code Online (Sandbox Code Playgroud)
# A tibble: 9 x 4
     ID  Col1  Col2  Col3
  <dbl> <dbl> <dbl> <dbl>
1     1     5    NA     1
2     1     8     2     5 …
Run Code Online (Sandbox Code Playgroud)

r dataframe dplyr

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

使用 dplyr 按行用以前的值填充缺失值

我正在处理一个数据框,R其中跨行有一些缺失值。接下来是数据框(最后dput添加):

df
  id V1 V2 V3 V4
1 01  1  1  1 NA
2 02  2  1 NA NA
3 03  3  1 NA NA
4 04  4  1  2 NA
Run Code Online (Sandbox Code Playgroud)

每一行都是不同的id。如您所见,行有缺失值。我想知道如何在不使用 reshape to long 或 pivot 的情况下以这种样式完成数据框,因为我的真实数据非常大

df
  id V1 V2 V3 V4
1 01  1  1  1  1
2 02  2  1  1  1
3 03  3  1  1  1
4 04  4  1  2  2
Run Code Online (Sandbox Code Playgroud)

我试图使用fill …

r dplyr

7
推荐指数
4
解决办法
164
查看次数

rowwise() 与 dplyr 中的列名向量求和

我再次对如何实现这一目标感到困惑:

鉴于此数据框:

df <- tibble(
  foo = c(1,0,1),
  bar = c(1,1,1),
  foobar = c(0,1,1)
)
Run Code Online (Sandbox Code Playgroud)

这个向量:

to_sum <- c("foo", "bar")
Run Code Online (Sandbox Code Playgroud)

我想获得列中值的行式总和to_sum

期望的输出:

# A tibble: 3 x 4
# Rowwise: 
    foo   bar foobar   sum
  <dbl> <dbl>  <dbl> <dbl>
1     1     1      0     2
2     0     1      1     1
3     1     1      1     2
Run Code Online (Sandbox Code Playgroud)

输入它是有效的(显然)。

df %>% rowwise() %>% 
  mutate(
    sum = sum(foo, bar)
  )
Run Code Online (Sandbox Code Playgroud)

这不会:

df %>% rowwise() %>% 
  mutate(
    sum = sum(to_sum)
  )
Run Code Online (Sandbox Code Playgroud)

我理解,因为如果我要尝试:

df %>% rowwise() …
Run Code Online (Sandbox Code Playgroud)

r dplyr rlang

7
推荐指数
2
解决办法
78
查看次数

有没有办法根据条件将相关变量折叠成一个?

比方说,我有多个变量衡量物质滥用即A1是alcohal使用A2是bhangA3是可卡因。我想生成变量afin如果三者中的任何一个是肯定的,表明参与药物滥用的。

有没有办法缩短代码,所以我不指定使用多个ifelse语句,如下所示?试图找到最好的方法来做到这一点,因为我有 10 多个变量可以合并为一个,而写作ifelse可能并不理想。

# Anymatch
library(tidyverse)

set.seed(2021)

mydata <- tibble(
  a1 = factor(round(runif(20, 1, 3)),
              labels = c("Yes", "No", "N/A")),
  a2 = factor(round(runif(20, 1, 3)),
              labels = c("Yes", "No", "N/A")),
  a3 = factor(round(runif(20, 1, 3)),
              labels = c("Yes", "No", "N/A")),
  b1 = round(rnorm(20, 10, 2)))
mydata

mydata <- mydata %>%
  mutate(afin = ifelse(a1 == "Yes"|a2=="Yes"|a3=="Yes", "Yes", "No"))

Run Code Online (Sandbox Code Playgroud)

r dplyr

6
推荐指数
2
解决办法
50
查看次数

如何在 R 中将选定的行转换为单列

我有一个需要转换的数据框。我需要根据列的值将唯一行更改为单列。

我的数据如下:

df1 <- data.frame(V1 = c("a", "a", "b", "b","b"), 
                  V2 = c("product1", "transport", "product1", "product2","transport"),
                  V3 = c("100", "10", "100", "100","10"))

> df1
  V1        V2  V3
1  a  product1 100
2  a transport  10
3  b  product1 100
4  b  product2 100
5  b transport  10
Run Code Online (Sandbox Code Playgroud)

我需要进行以下转换,并将 V3 的值除以 V1 中包含的产品数量。

> df2
  V1       V2 transport  V3
1  a product1        10 100
2  b product1         5 100
3  b product2         5 100
Run Code Online (Sandbox Code Playgroud)

r dataframe dplyr data.table tidyr

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

R 函数中...的奇怪行为

如果一个函数有一个参数和椭圆并且两者以相同的字母开头,我会遇到奇怪的行为。一个玩具示例是这个

> testfun=function(aa=0, ...) {print(aa); list(...)} 
> testfun(b=1)
[1] 0
$b
[1] 1

> testfun(a=1)
[1] 1
list()
Run Code Online (Sandbox Code Playgroud)

因此,当我调用时testfun(b=1),一切正常,aa打印为 0 并返回元素 b=1 的列表。但是,如果我调用testfun(a=1),aa 现在为 1 并且返回一个空列表。显然,如果有一个参数以与传递给 ... 的字母相同的字母开头,则该参数会发生更改并且...会丢失。

知道这是为什么吗?有什么办法可以避免这种情况吗?在我真正的问题中,...由用户提供,他们可能使用任何名称作为参数(除了那些已经是函数参数的名称,例如这里的 aa )

r user-defined-functions

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

标签 统计

r ×10

dplyr ×7

dataframe ×4

tidyr ×2

coalesce ×1

data.table ×1

lm ×1

na ×1

purrr ×1

rlang ×1

user-defined-functions ×1