将一个数据帧中的单元值与另一个数据帧中的相应单元值连接

时间:2018-06-04 03:11:14

标签: r dataframe

我有两个包含聚合数据的数据框。第一个数据框由经历情景A,B和C的3组(第1组,第2组和第3组)的中值组成。

我的第二个数据框由3个组(第1组,第2组和第3组)的样本大小组成,这些组经历了方案A,B和C.

数据类似于以下内容:

median_data <- data.frame(Group = c(1, 2, 3), scenario_A = c(296.7, 152.3, 113.6), 
                      scenario_B = c(109, 76, 79), scenario_C = c(321.5, 236.5, 191))

sample_size_data <- data.frame(Group = c(1, 2, 3), scenario_A = c(113, 121, 59),
                           scenario_B = c(100, 100, 55), scenario_C = c(100, 100, 55))

我想将两个数据帧中Scenario列中的值转换为字符数据类型,并将第一个数据帧(中值)的一个单元格中的值与第二个数据帧中的相应单元格(样本大小)连接起来。

我在Stackoverflow上搜索过;这不是一个rbind / cbind问题。我想到的所需输出是将数据帧1中的第1行第1列与数据第2帧中的第1行第1列连接起来,依此类推。

所需的输出如下所示: Desired Output

我尝试过以下代码,几乎是正确的。我不知道如何将其更改为3行,4列数据帧,并且结果数据框中第1列(组)的样本大小不应该存在。

df <- data.frame(paste(apply(median_data, 2, as.character), " (n = ", 
                   apply(sample_size_data, 2, 
                         as.character), ")",sep = ""))

谢谢,非常感谢!

3 个答案:

答案 0 :(得分:4)

将计数器传递给apply语句以索引第二个数据帧

i<-1

x<-as.data.frame(apply(median_data[,-1], 2, function(x) {
  i<<-i+1
  paste0(x, " (n = ",sample_size_data[,i],")")
}))

x<-cbind(Group=median_data[,1], x)

x
  Group      scenario_A    scenario_B      scenario_C
1     1 296.7 (n = 113) 109 (n = 100) 321.5 (n = 100)
2     2 152.3 (n = 121)  76 (n = 100) 236.5 (n = 100)
3     3  113.6 (n = 59)   79 (n = 55)    191 (n = 55)

答案 1 :(得分:3)

使用的解决方案。我们可以将两个数据框都准备为字符,使用bind_rows将它们组合起来,然后使用group_bysummarise_all来连接所有列。

library(dplyr)

median_data2 <- median_data %>%
  mutate_at(vars(-Group), funs(as.character(.)))

sample_size_data2 <- sample_size_data %>%
  mutate_at(vars(-Group), funs(paste0("(n = ", ., ")")))

dat <- bind_rows(median_data2, sample_size_data2) %>%
  group_by(Group) %>%
  summarise_all(funs(paste(., collapse = " "))) %>%
  ungroup()
dat
# # A tibble: 3 x 4
#   Group scenario_A      scenario_B    scenario_C     
#   <dbl> <chr>           <chr>         <chr>          
# 1     1 296.7 (n = 113) 109 (n = 100) 321.5 (n = 100)
# 2     2 152.3 (n = 121) 76 (n = 100)  236.5 (n = 100)
# 3     3 113.6 (n = 59)  79 (n = 55)   191 (n = 55)    

答案 2 :(得分:2)

我们可paste data.frameMap的相应列out <- median_data out[-1] <- Map(function(x, y) sprintf("%0.1f (n = %d)", x, y), median_data[-1], sample_size_data[-1])

data.frame

或将matrix转换为pasteout <- median_data out[-1] <- paste0(as.matrix(median_data[-1]), " (n=", as.matrix(sample_size_data[-1]), ")") out # Group scenario_A scenario_B scenario_C #1 1 296.7 (n=113) 109 (n=100) 321.5 (n=100) #2 2 152.3 (n=121) 76 (n=100) 236.5 (n=100) #3 3 113.6 (n=59) 79 (n=55) 191 (n=55)

mpf.candlestick_ohlc