【问题标题】:How to create a column containing a string of stars to indicate levels of a factor in a data frame in R如何创建包含一串星号的列以指示 R 中数据框中某个因子的级别
【发布时间】:2010-04-06 14:29:49
【问题描述】:

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

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

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

这就是我想要创建一个“级别”很多星的列,但它失败了

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

似乎每次需要为 rep 提供一个值。我觉得这应该是可能的(我的直觉说'使用 lapply',但我的应用 fu 很差)

有人想试试吗?

【问题讨论】:

    标签: r lapply


    【解决方案1】:

    您可以将星星矢量创建为

    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 快得多。

    【讨论】:

      【解决方案2】:

      我认为您将需要一个应用类型的函数。这将起作用:

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

      在这种情况下使用sapply 比使用lapply 更好,因为它返回的是向量而不是列表。

      来自代表的帮助:

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

      rep 与向量用于times 参数的一个问题是,它只返回一个向量,并且在times=0 时丢弃实例。您可以使用以下命令查看:rep(rep("*", nrow(df)), times=df$level)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-10
        • 2017-08-23
        • 2022-01-20
        • 2021-03-01
        相关资源
        最近更新 更多