(今天第二个问题 - 一定是糟糕的一天)
我有一个包含各种列的数据框,包含一个浓度列(数字),一个突出显示无效结果的标志(布尔值)和一个问题描述(字符)
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',但我的申请福是穷人)
有人想尝试吗?
答案 0 :(得分:3)
您可以将星形矢量创建为
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
快得多。
答案 1 :(得分:2)
我认为您需要一个应用类型的功能。这将有效:
df[is.na(df$level),"level"] <- 0
df$level <- sapply(df$level, function(x) paste(rep("*",x),collapse=""))
在这个实例中,您最好使用sapply
而不是lapply
,因为它返回的是向量而不是列表。
来自代表的帮助:
如果'时间'由一个单一组成 整数,结果由 整个输入重复这么多次。如果'times'是一个向量 长度与'x'相同(在'''复制之后), 结果包括'x [1]'重复'次[1]'次,'x [2]' 重复'次[2]次等等。
将rep
与times参数的向量一起使用的一个问题是它只返回一个向量,并在times = 0时丢弃实例。您可以使用以下命令查看此内容:rep(rep("*", nrow(df)), times=df$level)
。