在 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 = FALSE
是 data.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
我有一个 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 = FALSE
是 data.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