逐个单元地连接两个矩阵或数据帧

时间:2015-04-19 20:37:13

标签: r

我希望连接dfp,如我的MRE的最后一步所示。有什么想法吗?

# functions ----
  asterisk <- function(y) symnum(y, c(0, .001, .01, .05, .1, 1), 
                                 c("***", "**", "*", ".", " "))
  rd2 <- function(y) sprintf("%.2f", round(y, 2))
# packages ----
  require(foreign)
  require(nnet)
# example data from http://www.ats.ucla.edu/stat/r/dae/mlogit.htm
  ml <- read.dta("http://www.ats.ucla.edu/stat/data/hsbdemo.dta")
  ml$prog2 <- relevel(ml$prog, ref = "academic")
  test <- multinom(prog2 ~ ses + write, data = ml)
# get coefficients and round
  df <- data.frame(coefficients(test))
  df <- as.data.frame(lapply(df, rd2))
  row.names(df) <- row.names(coefficients(test))
  df
  #             X.Intercept.  sesmiddle seshigh write
  # general     2.85          -0.53     -1.16   -0.06
  # vocation    5.22          0.29      -0.98   -0.11
# get p-values
  z <- summary(test)$coefficients/summary(test)$standard.errors
  p <- matrix((1 - pnorm(abs(z), 0, 1)) * 2, nrow=nrow(z))
  p <- as.data.frame(apply(p, c(1,2), asterisk))
  #    V1 V2 V3  V4
  # 1   *     *  **
  # 2 ***     . ***
# concatenate df and p
  #             X.Intercept.  sesmiddle seshigh write
  # general     2.85*         -0.53     -1.16*  -0.06**
  # vocation    5.22***        0.29     -0.98.   -0.11***

2 个答案:

答案 0 :(得分:3)

如果您不介意用连锁数据覆盖现有的df

df[] <- lapply(1:ncol(df), function(col) paste0(df[,col],p[,col]) );

如果没有,您可以从df(比如说​​dfp)指定一个新变量,然后分配该变量。

使用原始df作为此任务的起点非常有用,因为它可以避免担心设置/修复维名称。

答案 1 :(得分:2)

您可以使用mapply粘贴带星号的数字:

as.data.frame(
  mapply(FUN = paste, df, p),
  row.names = row.names(df)  
)