我有一个数据框st
:
Col | Val
d16 | 1
d17 | 1
d18 | 1
我已使用paste0
来获取p1<-paste0(st$c, "==", st$val, sep="&", collapse = "")
给出“d16 == 1&amp; d17 == 1&amp; d18 == 1&amp;”然后创建
p2<-substr(p1, 1, nchar(p1)-1)
摆脱p1中的最后一个&
。
执行所有这些操作的主要原因是,我有一个更大的数据集,我们称之为ST
,其中包含d16
,d17
和d18
列我希望使用以下命令对ST
进行分组:
ST <- subset(ST, p2)
然而,当我尝试时,我得到Error in subset.data.frame(seg, p2) : 'subset' must be logical
哪个有意义,p2
必须是LOGICAL类,而不是类CHAR。我尝试过使用as.logical
,我尝试先将其转换为因子,然后使用as.logical
。但那没用。我也试过使用eval(parse(text=p2))
,但也没有运气。
如何更改p2
以便在subset
内使用?
背景 我想保持我想做的事情很简单,但我认为这会导致更多的混乱,所以我想解释为什么我甚至遇到了这个问题。
我真正在做的是一个闪亮的应用程序。我有ST
看起来像
d16 d17 d18 t14 t15 t16 z15 z16 z20
1 1 0 1 1 1 1 1 1 0 0
2 1 0 0 1 0 0 0 0 1 0
3 0 1 0 1 1 0 1 1 1 1
4 1 1 0 0 0 1 1 0 1 0
列的名称并不重要,但ST
本质上有很多列,每个条目都是1或0.由于有很多列(100+),我希望用户预先选择他们想要查看原始数据的列。我的解决方案是使用带有'1','0'或'2'的单选按钮进行无选择。然后我会接受这些输入并创建一个值向量:val
,并将其组合到一个数据框中,其列名来自ST
,然后st
来自所选的列:
val<-c(0,1,1,1,0,0,2,2,2)
c<-colnames(ST)
test<-data.frame(c,val)
st<-subset(test, val==1)
然后我试图使用
p1<-paste0(st$c, "==", st$val, sep="&", collapse = "")
p2<-substr(p1, 1, nchar(p1)-1)
这样我就可以将p2
输入另一个subset
函数。
答案 0 :(得分:0)
如果你注定要坚持你的方法,那么确实创建p2作为一个包含规则的字符串已经朝着错误的方向迈出了一步,那么你可能真的需要做类似......
# example
eval(parse(text = "Day == 1"), envir = airquality)
# your case
eval(parse(text = p2), envir = ST)
...创建索引的逻辑向量,然后您甚至可以在简单的[
下标中使用
编辑以下评论,显示角色条件的一种可能替代方法:
# assuming your st as above:
st <- data.frame(Col = c("d16", "d17", "d18"), Val = 1)
# transpose
st2 <- data.frame(t(st$Val))
colnames(st2) <- st$Col
st2
# d16 d17 d18
#1 1 1 1
# merge (default arguments fit your case)
merge(ST, st2)
如果需要,您还可以将data.frames
转换为data.tables
,并对其执行相同的merge
。即data.table::setDT(ST)
,data.table::setDT(st2)
等
答案 1 :(得分:0)
你在做什么子集?应该是问题。请记住,我们对列满足特定条件的行进行子集化。赋予subset
函数的条件应包含以下列:
让我们举一个例子:
(dat=data.frame(d16=c(-1,1,1,3,4,5),d17=c(5,4,1,1,2,3),d18=1))
d16 d17 d18
1 -1 5 1
2 1 4 1
3 1 1 1
4 3 1 1
5 4 2 1
6 5 3 1
这是我们的数据:在上面的数据中,我们希望获得d16=1&d17=1&d18=1
行。我们可能有很多变量,因此我们可以使用您建议的粘贴方法:
subset(dat,eval(parse(text=paste0(ST$Col,"==",ST$Val,collapse = "&"))))
d16 d17 d18
3 1 1 1
其中数据框ST
的位置为:
ST
Col Val
1 d16 1
2 d17 1
3 d18 1
您的问题出在您要分组的数据中。使用正确的数据,您可以执行子集。