代码之家  ›  专栏  ›  技术社区  ›  PaulHurleyuk

如何在r中创建包含一系列星的列,以在数据帧中创建因子的级别

  •  1
  • PaulHurleyuk  · 技术社区  · 16 年前

    (今天的第二个问题-一定是糟糕的一天)

    我有一个包含不同列的数据框,包括一个集中列(数字)、一个突出显示无效结果的标志(布尔值)和一个问题描述(字符)

    df <- structure(list(x = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), rawconc = c(77.4, 
    52.6, 86.5, 44.5, 167, 16.2, 59.3, 123, 1.95, 181), reason = structure(c(NA, 
    NA, 2L, NA, NA, NA, 2L, 1L, NA, NA), .Label = c("Fails Acceptance Criteria", 
    "Poor Injection"), class = "factor"), flag = c("False", "False", 
    "True", "False", "False", "False", "True", "True", "False", "False"
    )), .Names = c("x", "rawconc", "reason", "flag"), row.names = c(NA, 
    -10L), class = "data.frame")
    

    我可以用“原因”列的数字级别创建一个列

    df$level<-as.numeric(df$reason)
    df
        x rawconc                    reason  flag level
    1   1   77.40                      <NA> False    NA
    2   2   52.60                      <NA> False    NA
    3   3   86.50            Poor Injection  True     2
    4   4   44.50                      <NA> False    NA
    5   5  167.00                      <NA> False    NA
    6   6   16.20                      <NA> False    NA
    7   7   59.30            Poor Injection  True     2
    8   8  123.00 Fails Acceptance Criteria  True     1
    9   9    1.95                      <NA> False    NA
    10 10  181.00                      <NA> False    NA
    

    我想做的是创建一个“level”很多星星的列,但是失败了

    df$stars<-paste(rep("*",df$level)sep="",collapse="")
    Error: unexpected symbol in "df$stars<-paste(rep("*",df$level)sep"
    
    df$stars<-paste(rep("*",df$level),sep="",collapse="")
    Error in rep("*", df$level) : invalid 'times' argument
    
    rep("*",df$level)
    Error in rep("*", df$level) : invalid 'times' argument
    
    df$stars<-paste(rep("*",pmax(df$level,0,na.rm=TRUE)),sep="",collapse="")
    Error in rep("*", pmax(df$level, 0, na.rm = TRUE)) : 
      invalid 'times' argument
    

    似乎一次只能给代表一个值。我觉得这应该是可能的(我的直觉告诉我“使用lapply”,但我的apply fu是v.poor)

    有人想试试吗?

    2 回复  |  直到 16 年前
        1
  •  2
  •   Shane    16 年前

    我想你需要一个apply类型的函数。这将起作用:

    df[is.na(df$level),"level"] <- 0
    df$level <- sapply(df$level, function(x) paste(rep("*",x),collapse=""))
    

    你最好用 sapply lapply 因为它返回的是一个向量而不是一个列表。

    从帮助代表:

    如果“时间”由一个 整数,结果由 整个输入重复了很多次。如果“时间”是向量 长度与“x”(由“each”复制后)相同的 结果由'x[1]'重复'times[1]'次'x[2]组成 重复“次[2]次”等。

    使用中的一个问题 rep 对于times参数的向量,它只返回一个向量,当times=0时,它会丢弃实例。使用此命令可以看到: rep(rep("*", nrow(df)), times=df$level) .

        2
  •  3
  •   Marek    16 年前

    你可以创建星向量

    vstars <- sapply(1L:nlevels(df$reason), function(i) paste(rep("*",i),collapse=""))
    vstars
    # [1] "*"  "**"
    

    然后用索引 df$reason (因为它是一个因素):

    vstars[df$reason]
    # [1] NA   NA   "**" NA   NA   NA   "**" "*"  NA   NA
    

    为大 data.frame 应该快得多 paste 在每一行。