使用字符串 R 对数据帧进行子集化

subset a dataframe with character string R

我正在尝试通过在数据框的其中一列中选择字符串条件来对数据框进行子集化。这应该是一个简单的任务,我看到它已经被问过很多次了,但我完全卡住了

下面的数据框示例

structure(list(Analyte = c("Fe", "SiO2", "Al2O3", "TiO2", "Zr"
), Category = c("Certified", "Certified", "Certified", "Certified", 
"Informational"), AssignedValue = c("57.2", "6.7497718955", "2.8925", 
"0.146635643433333", "0.00393333333333333"), Uncertainty = c("0.0587455625228403", 
"0.0164487575063948", "0.0114603084512766", "0.00242243266797717", 
NA), CILower = c("57.0448631590115", "6.67853259277291", "2.82556340328344", 
"0.141155720022072", "0.00289242352888054"), CIUpper = c("57.4618035076551", 
"6.83390972656042", "2.93457675661656", "0.152115566844594", 
"0.00497424313778613"), labCV.all = c("0.515527815366847", "1.64892092489221", 
"2.51730947074656", "5.4795936391998", "22.5584788355489"), totalSamples = c("65", 
"65", "65", "65", "36"), NoLabs = c("10", "10", "10", "10", "5"
), Sy = c("0.291421208884417", "0.108601127975891", "0.0761950799826298", 
"0.00766040470920629", NA), Uchar = c("0.0921554778554455", "0.0343426920867249", 
"0.0240949999243813", "0.00242243266797717", "0.0003749073959734"
)), row.names = c(1L, 2L, 3L, 4L, 24L), class = "data.frame")

我试过以下方法

df2 <- df[df$Category == "Certified"]

但是新数据帧 df2 与旧数据帧相同。

我认为这与以下事实有关:dataframe 是从 cbind 在一起的 dataframes 列表派生的,并且结构不太正确?

当我检查数据类型 typeof(df) 时,我得到列表

我尝试了很多不同的方法来转换为数据帧,但没有任何区别。

你需要一个逗号:

df[df$Category == "Certified",]

结尾的逗号确定您正在按行对数据框进行子集化。

没有逗号使得您可以对列进行子集化,正如您所看到的,因为混合了按行和按列进行子集化,Sy 列在没有逗号的情况下被删除。

没有尾随逗号将表达式转换为列式,如:

df[, df$Category == "Certified"]

因此,做:

> all(df[df$Category == "Certified"] == df[, df$Category == "Certified"], na.rm=T)
[1] TRUE
> 

会给TRUE,注意我用na.rm这样就不会变成NA.