R的两个数据格式化问题

时间:2011-06-28 05:33:30

标签: r if-statement formatting

我有两个问题,两个都很简单,我相信处理R。

我想创建一个IF语句,它将NA值分配给列中的某些行。我尝试了以下命令:

a[a[,21]==0,5:10] <-NA

错误说:

  

[&。 - 。data.frame( tmp ,a [,21] == 0,5:20,value = NA)出错:在下标的分配中不允许缺少值数据框

本质上,该代码应该在第21列中取任何0值,并将该行的值从第5列到第10列替换为NA。第21栏已经有了NA,但我不确定这是否有效?

我不知道如何制作下一个功能。我需要操纵包含正面和负面控件的数据。但是,当我操纵数据时,我不希望正面和负面控制值分开操作,但我希望正面和负面控件保留在列中,因为我必须稍后使用它们。无论如何暂时忽略这些值,以便它们不包含在操作中?

这里有样本数据:

L = c(2,1,4,3,1,4,2,4,5,1) 
R = c(2,4,5,1,"Neg",2,"",1,2,1) 
T = c(2,1,4,2,"CTRL",2,"PCTRL",2,1,4) 
test <- data.frame(L=L,R=R,T=T)

我希望能够根据字符“Neg”“CTRL”/“”“PCTRL”暂时忽略这些行,而不是它们在数据帧中的位置(如果可能)。注意负控制,Neg和CTRL如何在单独的列中,相同的行,就像正控制一样,其中有一个空白而PCTRL在单独的列中但是相同的行。鉴于这些奇怪的条件,有什么方法可以做到这一点吗?

希望这写得足够清楚,我提前感谢任何人花时间帮助我!

3 个答案:

答案 0 :(得分:5)

尝试将数据帧子集化为R不是“Neg”的行:

subset(test, R!="Neg")

对于NA问题,您的数据框中可能已经有NA,对吧?试试这是否有效:

a[a[,21] %in% 0, 5:10] <- NA

答案 1 :(得分:4)

尝试改为:

a[ which(a[,21]==0), 5:10] <-NA

说明:==操作返回NA值,[<-函数不接受它们。 which函数将返回一个数字向量并“丢弃NA”。另外,[函数(没有'&lt; - ')将返回所有NA行。这被认为是一个“特征”,但我发现它是一个“烦恼”,因此我通常会使用which进行选择以及选择性分配。

答案 2 :(得分:3)

对于第一个问题:如果[,21]是否定的,你想分配NA吗?在这种情况下,

a[replace(a[,21],is.na(a[,21]),0)==0,5:10] <- NA

否则(注意我用非零的东西替换了“0”的替换值(这里使用“1”,但只要它不为零就没关系),

a[replace(a[,21],is.na(a[,21]),1)==0,5:10] <- NA

至于第二个问题,

subset(test,! (L %in% c("Neg","") | T %in% c("CTRL","PCTRL")))

如果LT中的过滤条件并不总是一致的话。如果它们始终一致,那么您只需将测试应用于LT中的一个。此外,您可能还需要记住T曾代表S,S-PLUS和R中的TRUE(仍然如此);你可以将另一个值重新分配给T,事情会好起来的,但我相信这一点通常是不鼓励的(同样适用于c,人们也喜欢分配给它。)