在 csv 文件的 R 中,从包含超过 2 个字符的列中获取行

In R from a csv file get rows from a column which contain more then 2 characters

我有一个 csv 文件,我必须从该文件中获取特定列中超过 2 个字符的行。我的 csv 文件看起来像这样

"Name" "Age" "ID"     "RefID"
"ABC"  "12"  "Abccc"  "xyzw"
"AAA"  "14"  "A"      "X"
"BBB"  "18"  "DEfff"  "dfg"
"CCY"  "10"  "F"      "XY"
"CCZ"  "20"  "R"      "XYC"

因此,从第 3 列和第 4 列中,我获取了具有 >= 两个字符的行。

我尝试了以下方法

data = read.table(file ='res.csv', header = T)
dat2 = as.character(data[,3])
ind = dat2[(which(nchar(dat2) >=2)),]

但它给我错误,我无法找出如何同时处理两个列。 我的结果应该如下所示

"Name" "Age" "ID"     "RefID"
"ABC"  "12"  "Abccc"  "xyzw"
"BBB"  "18"  "DEfff"  "dfg"
"CCY"  "10"  "F"      "XY"
"CCZ"  "20"  "R"      "XYC"

如有任何帮助,我们将不胜感激

我们可以避免多个步骤,即通过在 read.table 中指定 stringsAsFactors = FALSE 来避免将字符列转换为 factor,从而避免转换为 character class class。然后用nchar得到第3列的字符个数,如果大于等于2

则创建逻辑条件
data[nchar(data[,3])>=2,]
#   Name Age    ID RefID
#1  ABC  12 Abccc  xyzw
#3  BBB  18 DEfff   dfg

对于多列,使用&

data[nchar(data[,3])>=2 & data[,4] >=2,]

但是,当有 100 列时,它会变得有点困难。为此,我们循环遍历感兴趣的列,进行比较,然后 Reduce 将其转换为单个逻辑 vector

data[Reduce(`&`, lapply(data[3:4], function(x) nchar(x) >=2)),]
#  Name Age    ID RefID
#1  ABC  12 Abccc  xyzw
#3  BBB  18 DEfff   dfg

如果 any 列的条件需要为 TRUE,则将 Reduce

中的 & 更改为 |
data[Reduce(`|`, lapply(data[3:4], function(x) nchar(x) >=2)),]
#   Name Age    ID RefID
#1  ABC  12 Abccc  xyzw
#3  BBB  18 DEfff   dfg
#4  CCY  10     F    XY
#5  CCZ  20     R   XYC

数据

data <- read.table(file ='res.csv', header = TRUE, stringsAsFactors = FALSE) 

这是一个基于data.table的解决方案。 stringsAsFactors = FALSEdata.table::fread 中的默认值。

require(data.table)

x= 
fread('"Name" "Age" "ID"     "RefID"
"ABC"  "12"  "Abccc"  "xyzw"
"AAA"  "14"  "A"      "X"
"BBB"  "18"  "DEfff"  "dfg"
"CCY"  "10"  "F"      "XY"
"CCZ"  "20"  "R"      "XYC"')

x[nchar(ID)>2 | nchar(RefID)>2]

   Name Age    ID RefID
1:  ABC  12 Abccc  xyzw
2:  BBB  18 DEfff   dfg

对于 OR (|) 的情况,您还可以根据姓名和年龄以及基于 nchar 的子集进行融合。 这是 one-liner:

z = melt(x, id.vars = c('Name', 'Age'))[nchar(value) > 2 ]
z 
 Name Age variable value
1:  ABC  12       ID Abccc
2:  BBB  18       ID DEfff
3:  ABC  12    RefID  xyzw
4:  BBB  18    RefID   dfg
5:  CCZ  20    RefID   XYC