如何创建包含分的字符串,以指示在R中的数据帧的一个因素的电平的列

StackOverflow https://stackoverflow.com/questions/2585583

  •  24-09-2019
  •  | 
  •  

(第二个问题今天 - 必须是一个坏天)

我有各种列的数据帧,inculding浓缩柱(数字),一个标志突出无效结果(布尔值)和问题(字符)的描述

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

似乎代表需要被一次供给一个值。我觉得这应该是可能的(和我的直觉说“使用lapply”,但我的申请福诉差)

任何一个想试试吗?

有帮助吗?

解决方案

我认为你会需要一个应用型功能。这将工作:

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

您将得到更好的使用sapplylapply在这种情况下,因为它返回一个向量而不是列表。

从帮助代表:

  

如果“次”由一个单一的   整数,结果由        整个输入重复很多次。如果“时间”是一个矢量        相同的长度“X”(由“各自”复制之后),        结果由 '×[1]' 重复 '次[1]' 倍, '×[2]'        重复 '次[2]' 倍等。

的一个问题与使用rep与用于次向量参数是它只是返回一个矢量,并将其丢弃情况下,当次= 0。你可以用这个命令来查看这一点:rep(rep("*", nrow(df)), times=df$level)

其他提示

您可以创建分矢量作为

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top